首页 > 解决方案 > SQLAlchemy joinload 与 backref 关系

问题描述

我有 3 个模型

class Item(Base):
    __tablename__ = 'items'
    auto_inc = Column(Integer, primary_key=True, nullable=False)
    id = Column('item_id', String(50, "utf8_unicode_ci"), unique=True, nullable=False)
    purchase_order = relationship('PurchaseOrder', back_populates='items')

class PurchaseOrder(Base):
    __tablename__ = 'purchase_orders'
    auto_inc = Column(Integer, primary_key=True, nullable=False)
    id = Column('purchase_order_id', String(50, "utf8_unicode_ci"), unique=True, nullable=False)
    items: List[Item] = relationship('Item', order_by='Item.auto_inc', back_populates='purchase_order')
    user = relationship('User')

class User(Base):
    id: str = Field(title="User ID")
    first_name = Column(String(45, "utf8_unicode_ci"), index=True)
    last_name = Column(String(45, "utf8_unicode_ci"), index=True)

假设我想从它的 id 中获取一个项目,我可能需要稍后访问 PurchaseOrder。

如果我这样查询:

item = session.query(Item).options(joinedload(Item.purchase_order).joinedload(PurchaseOrder.user)).get(item_id)

该项目有时会与里面的每个项目一起返回item.purchase_order.items,但有时item.purchase_order.items会返回 null。

如果我进行以下查询,它总是会返回里面的每个项目item.purchase_order.items

item = session.query(Item).options(joinedload(Item.purchase_order).joinedload(PurchaseOrder.user)).options(joinedload(Item.purchase_order).joinedload(PurchaseOrder.items)).get(item_id)

在这种情况下,这是进行查询的正确(也是最有效)的方式吗?

标签: pythonmysqlpython-3.xsqlalchemyfastapi

解决方案


推荐阅读