sqlalchemy 有没有办法在单个查询中关闭声明性的多态连接加载?大多数时候它很好,但我有:
class A(Base) :
discriminator = Column('type', mysql.INTEGER(1), index=True, nullable=False)
__mapper_args__ = { 'polymorphic_on' : discriminator }
id = Column(Integer, primary_key=True)
p = Column(Integer)
class B(A) :
__mapper_args__ = { 'polymorphic_identity' : 0 }
id = Column(Integer, primary_key=True)
x = Column(Integer)
class C(A) :
__mapper_args__ = { 'polymorphic_identity' : 1 }
id = Column(Integer, primary_key=True)
y = Column(String)
我想进行查询,以便获得所有 Bx > 10 的 A.id,如果 A 实际上是 B,或者 Cy == 'blah',如果 A 实际上是 C,全部按 p 排序。
为了迭代地进行,我从第一部分开始——“如果 A 实际上是 B,则获取 Bx > 10 的所有 A.id”。所以我想我会从外部连接开始:
session.query(A.id).outerjoin((B, B.id == A.id)).filter(B.x > 10)
...除了似乎没有办法避免让该 outerjoin((B, B.id == A.id)) 子句生成子选择中 A 中的所有内容与 B 中的所有内容的完全连接。如果 B 不从 A 继承,那么这不会发生,所以我认为是多态声明性代码生成做到了这一点。有没有办法关闭它?或者强制外连接做我想做的事?
我想要的是这样的:
select a.id from A a left outer join B b on b.id == a.id where b.x > 10
但相反,我得到了类似的东西:
select a.id from A a left outer join (select B.id, B.x, A.id from B inner join A on B.id == A.id)
...顺便说一句,如果不可能,那么后者的效率是否低于前者?sql 引擎会实际执行该内部连接,还是会忽略它?