Есть ли в 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.ids, для которых Bx> 10, если это A на самом деле B, или гдеCy == 'бла', если это A на самом деле C, все упорядочено по p.
Чтобы сделать это итеративно, я начинаю только с первой части - "получить все A.id, для которых Bx> 10, если это A на самом деле B ".Поэтому я подумал, что начну с внешнего соединения:
session.query(A.id).outerjoin((B, B.id == A.id)).filter(B.x > 10)
... за исключением того, что, похоже, нет способа избежать использования этого предложения externaljoin ((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 engine на самом деле выполнять это внутреннее соединение, или он его исключит?