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

时间:2014-09-12 14:10:01

标签: sqlalchemy

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

以下是类声明的示例:

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'”

我该如何进行此类查询?

1 个答案:

答案 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}} - 加载的关系。