首页 > 解决方案 > 用于多表连接的 SQL Alchemy 映射器

问题描述

我有三张桌子:

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)
)

AFarmer可以有 0-nFruit和/或 0-n Vegetables

鉴于farmer_id我想获取农民的详细信息(为简洁起见,上面省略了其他列)以及他们可能种植的所有水果/蔬菜的所有详细信息,SQL 将是:

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 = ?;

我可以使用 SQLAlchemy 核心查询来复制它,如下所示:

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 == ?
)

我不确定的是如何将此查询的结果映射到对象中。我似乎需要使用 amapper和一些类,但我不确定如何使用多个连接来做到这一点。

如何编写映射器以获取上述查询的结果并沿以下行生成对象图:

class FarmerObject:
    fruits = [...]
    vegetables = [...]

标签: pythonsqlalchemyfastapi

解决方案


推荐阅读