SQLAlchemy теряет метку столбца в объединенном соединении / исключением_ - PullRequest
0 голосов
/ 09 мая 2018

У меня есть несколько сложный запрос, где мне нужно присоединиться к подзапросу. Этот подзапрос содержит исключение и объединение. В 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 или я что-то не так делаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...