I am using FastAPI with strawberry connected to a MySQL database. I have a table called User that is related to a foreign key called IdState with the State table. I would like to know how I can integrate the relationship between my model and the column so that fast api returns all the corresponding State object.
This is my model: User
from conn.db import meta
from sqlalchemy import ForeignKey
from sqlalchemy import Table, Column, Integer, String
from sqlalchemy.sql.sqltypes import Integer, String
usuarios = Table('usuarios', meta,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('nombre', String(50)),
Column('correo', String(50)),
Column('idEstado', Integer, ForeignKey('estados.id'), default=1)
)
And this is my model State:
from conn.db import meta
from sqlalchemy import Table, Column, Integer, String
from sqlalchemy.sql.sqltypes import Integer, String
estados = Table('estados', meta,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('nombre', String(50)),
Column('descripcion', String(50)),
)
and this is my tipping user:
import typing
import strawberry
from conn.db import conn
from models.index import usuarios
from models.index import estados
from strawberry.types import Info
from sqlalchemy.orm import relationship, joinedload
@strawberry.type
class Estado:
id: int
nombre: str
descripcion: str
@strawberry.type
class Usuario:
id: int
nombre: str
correo: str
idEstado: int
@strawberry.type
class Query:
@strawberry.field
def usuario(id: int) -> Usuario:
return conn.execute(usuarios.select().options(joinedload(estados.id)).where(usuarios.c.id == id)).fetchone()
@strawberry.field
def usuarios(self) -> typing.List[Usuario]:
return conn.execute(usuarios.select()).fetchall()
@strawberry.type
class Mutation:
@strawberry.mutation
def create_flavour(self, nombre: str, info: Info) -> bool:
return True
@strawberry.mutation
async def create_usuario(self, nombre: str, correo: str, info: Info) -> int:
usuario = {
"nombre": nombre,
"correo": correo
}
result = conn.execute(usuarios.insert(),usuario)
conn.commit();
return int(result.inserted_primary_key[0])
@strawberry.mutation
def update_usuario(self, id:int, nombre: str, correo: str, idEstado: int, info: Info) -> str:
result = conn.execute(usuarios.update().where(usuarios.c.id == id), {
"nombre": nombre,
"correo": correo,
"idEstado": idEstado
})
print(result. returns_rows)
conn.commit();
return str(result.rowcount) + " Row(s) updated"
@strawberry.mutation
def delete_usuario(self, id: int) -> bool:
result = conn.execute(usuarios.delete().where(usuarios.c.id == id))
return result.rowcount > 0
This is the "REQUEST"
query Ex{
usuarios{
correo,
nombre,
idEstado {
nombre,
descripcion
}
}
}
and this is the result what I looking for:
{
"data": {
"usuarios": [
{
"nombre": "levi zepeda acevedooooo update2",
"correo": "[email protected]",
"idEstado": {
"nombre": "Activo",
"descripcion": "Activo"
}
},
{
"nombre": "levi zepeda 2",
"correo": "[email protected]",
"idEstado": {
"nombre": "Activo",
"descripcion": "Activo"
}
}
]
}
}
Pls help :.)