Есть ли способ в 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, для которых B.x > 10, если этот A на самом деле является B, или где C.y == 'blah', если этот A на самом деле является C, все упорядочено по p.
Чтобы сделать это итеративно, я начинаю только с первой части - «получить все A.id, для которых B.x > 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 на самом деле выполнять это внутреннее соединение или он его проигнорирует?