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)
Aが実際にBである場合はBx>10、またはAが実際にCである場合はCy =='blah'であるすべてのA.idを取得するようにクエリを作成し、すべて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から継承しない場合、それは発生しないので、それを行うのは多態的な宣言型コード生成だと思います。それをオフにする方法はありますか?または、outerjoinに私が望むことを強制するのですか?
私が欲しいのはこのようなものです:
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エンジンは実際にその内部結合を実行しますか、それともそれを削除しますか?