SQLAlchemy:如何在场上过滤几个深层次的关系?
我有一个分层的数据库结构,我想在几个层次(关系)深的字段上使用过滤器进行查询 下面是类声明的示例:SQLAlchemy:如何在场上过滤几个深层次的关系?,sqlalchemy,Sqlalchemy,我有一个分层的数据库结构,我想在几个层次(关系)深的字段上使用过滤器进行查询 下面是类声明的示例: class cTransfer(Base): __tablename__ = 'mesTransfer' transferID = Column(UNIQUEIDENTIFIER, primary_key=True, autoincrement=False) quanID = Column(UNIQUEIDENTIFIER, ForeignKey('mesQuantum.q
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]))
我得到一个例外:“与CtrTransfer.quanObj关联的'InstrumentedAttribute'对象和'Comparator'对象都没有属性'orderItemObj'”
我怎样才能做这样的查询呢?下面应该会有帮助。基本上,您需要在所有级别执行
join
s:
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))
)
选项
行提示sqlalchemy
已加载关系,这样它就不会向SQL
添加额外的JOIN
到已连接的
加载的关系中。就是这样!非常感谢!:)