У меня есть несколько сложный запрос, где мне нужно присоединиться к подзапросу. Этот подзапрос содержит исключение и объединение. В RAW sql это выглядит примерно так
SELECT ... FROM table t
JOIN (SELECT id AS foo_id FROM foo WHERE select_me
EXCLUDE SELECT foo_id FROM bar WHERE add_or_remove = 'remove'
UNION SELECT foo_id FROM bar WHERE add_or_remove = 'add') subq
ON t.foo_id = subq.foo_id;
Где таблицы foo и bar определены следующим образом:
class Foo(Base):
__tablename__ = 'foo'
id = Column(Integer, primary_key=True, autoincrement=True)
select_me = Column(Boolean)
class Bar(Base):
__tablename__ = 'bar'
foo_id = Column(Integer, primary_key=True)
add_or_remove = Column(Enum('add', 'remove', name='add_or_remove'), primary_key=True)
Когда я пытаюсь сделать этот подзапрос в SQLAlchemy, при добавлении второго union
/ except_
.
он теряет метку столбца.
Вот о чем я говорю:
q = session.query(Foo.id.label('foo_id')).filter(Foo.select_me)
print(q.subquery().c)
Отпечатки ['%(140275696626880 anon)s.foo_id']
все еще содержит правильную этикетку
q = q.union(session.query(Bar.foo_id.label('foo_id')).filter(Bar.add_or_remove == 'add'))
print(q.subquery().c)
Отпечатки ['%(140275696767384 anon)s.foo_id']
все еще содержит правильную этикетку
q = q.except_(session.query(Bar.foo_id.label('foo_id')).filter(Bar.add_or_remove == 'remove'))
print(q.subquery().c)
Печатает ['%(140275696769064 anon)s.%(140275696769008 anon)s_foo_id']
Теперь столбец помечен автоматически сгенерированным именем, и я не могу использовать его для указания условия в join
.
Пока я думаю, что могу взять первый столбец и использовать его. Но это хакерское решение, поэтому мне интересно, если это ошибка в SQLAlchemy или я что-то не так делаю.