Tengo tres tablas:
Farmer = Table( "farmer", metadata, Column("farmer_id", UUID(), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) ) Fruit = Table( "fruit", metadata, Column("fruit_id", UUID(), primary_key=True, default=uuid.uuid4, unique=True, nullable=False), Column("farmer_id", UUID(), ForeignKey("farmer.farmer_id"), nullable=False) ) Vegetable = Table( "vegetable", Column("vegetable_id", UUID(), primary_key=True, default=uuid.uuid4, unique=True, nullable=False), Column("farmer_id", UUID(), ForeignKey("farmer.farmer_id"), nullable=False) ) Un Farmer puede tener 0-n Fruit y/o 0-n Vegetables .
Dado un farmer_id , quiero obtener los detalles del agricultor (hay otras columnas que quedan fuera de las anteriores por razones de brevedad) más todos los detalles de todas las frutas/verduras que podrían cultivar, el SQL sería:
SELECT * FROM farmer LEFT OUTER JOIN fruit ON farmer.farmer_id = fruit.farmer_id LEFT OUTER JOIN vegetable ON farmer.farmer_id = vegetable.farmer_id WHERE farmer_id = ?;Y puedo replicar eso con una consulta central de SQLAlchemy así:
query = select( [Farmer, Fruit, Vegetable] ).select_from( Farmer.join( Fruit, Farmer.c.farmer_id == Fruit.c.farmer_id, isouter=True ).join( Vegetable, Farmer.c.farmer.id == Vegetable.c.farmer_id, isouter=True ) ).where( Farmer.c.farmer_id == ? ) Lo que no estoy seguro es cómo mapear el resultado de esta consulta en objetos. Parece que necesito usar un mapper y algunas clases, pero no estoy seguro de cómo hacerlo con múltiples combinaciones.
¿Cómo escribo un mapeador para tomar el resultado de la consulta anterior y generar un gráfico de objetos a lo largo de las líneas de:
class FarmerObject: fruits = [...] vegetables = [...]