我有一个复杂的查询,我需要加入子查询。该子查询包含except和union。在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
中的条件。
现在我想我可以拿第一列并使用它。但这是一个hacky解决方案,所以我想知道这是SQLAlchemy中的错误还是我做错了。