我有一个分层数据库结构,我想在一个深度为几个级别(关系)的字段上使用过滤器进行查询。
以下是类声明的示例:
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'”
我该如何进行此类查询?
答案 0 :(得分:5)
下面应该有所帮助。基本上,您需要在所有级别执行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
添加额外的joined
1}} - 加载的关系。