gpt4 book ai didi

SQLAlchemy:如何在字段上过滤多个深层关系?

转载 作者:行者123 更新时间:2023-12-02 09:36:23 24 4
gpt4 key购买 nike

我有一个分层数据库结构,我想使用过滤器对多个级别(关系)深的字段进行查询。

以下是类声明的示例:

class cTransfer(Base):
__tablename__ = 'mesTransfer'
transferID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False)
quanID = Column(UNIQUEIDENTIFIER, ForeignKey('mesQuantum.quanID'))
quanObj = relationship('cQuantum', foreign_keys=[quanID], lazy='joined')

class cQuantum(Base):
__tablename__ = 'mesQuantum'
quanID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False)
orderItemID = Column(UNIQUEIDENTIFIER, ForeignKey('mesOrderItem.orderItemID'))
orderItemObj = relationship('cOrderItem', foreign_keys=[orderItemID], lazy='joined')

class cOrderItem(Base):
__tablename__ = 'mesOrderItem'
orderItemID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False)
orderID = Column(UNIQUEIDENTIFIER, ForeignKey('mesOrderHeader.orderID'))
orderHeaderObj = relationship('cOrderHeader', foreign_keys=[orderID], lazy='joined')

我想获取关联 orderID 位于某个列表中的所有 cTransfer。

所以我尝试这样做:

q = session.query(cTransfer).filter(cTransfer.quanObj.orderItemObj.orderID.in_([1, 2]))

我收到一个异常:“与 cTransfer.quanObj 关联的“InstrumentedAttribute”对象和“Comparator”对象都没有属性“orderItemObj””

我该如何进行这样的查询?

最佳答案

下面应该有帮助。基本上,您需要在所有级别执行 join:

orderIDs = [1, 2]
q = (session.query(cTransfer)
.join(cTransfer.quanObj)
.join(cQuantum.orderItemObj)
.filter(cOrderItem.orderID.in_(orderIDs))
.options(contains_eager(cTransfer.quanObj).contains_eager(cQuantum.orderItemObj))
)

options 行向 sqlalchemy 提示关系已加载,因此不会将额外的 JOIN 添加到SQL联接加载的关系。

关于SQLAlchemy:如何在字段上过滤多个深层关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25810256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com