我正常选择:
e = session.query(MyTable).filter(MyTable.pk=='abc').all()
MyTable映射到db。中的my_table
我还在数据库中创建了一个派生视图my_view
,其列名与my_table完全相同。
有没有办法在查询时在my_view
替换my_table
,以便从视图中返回行?显然,生成的对象需要只读 - 不打算改变它们。
所以基本上我想要SQL
FROM my_view AS my_table
而不是
FROM my_table
查询中的其他内容相同。
我不想创建另一个映射器,除非它可以自动完成,因为MyView有超过60列与MyTable相同。
更新:select_entity_from
似乎是我需要的,但在这种情况下,它只是添加到FROM表,而不是替换:
v = Table('my_view', metadata, autoload=True)
print session.query(MyTable).select_entity_from(v).filter(MyTable.pk=='abc')
"SELECT ... FROM my_table, my_view WHERE my_table.pk = 'abc';"
但以下只有一个FROM实体:
print session.query(MyTable).\
select_entity_from(select([MyTable])).\
filter(MyTable.pk=='abc')
"SELECT ... FROM (SELECT ... FROM my_tabl) AS anon_1 WHERE anon_1.pk = 'abc';"
答案 0 :(得分:0)
进一步挖掘让我更接近答案,但没有快乐。如果它需要进一步的想法,请在此处发布进展:
from sqlalchemy.orm.util import aliased
session.query(MyTable).select_entity_from(
select([aliased(MyTable, alias=v, adapt_on_names=True)])).\
filter(MyTable.pk=='abc')
adapt_on_names
似乎是我需要的,并且我已经仔细检查过该视图与表格具有完全相同的列名称,但上面仍然会生成两个froms
。
答案 1 :(得分:0)
提起我认为的错误:https://bitbucket.org/zzzeek/sqlalchemy/issues/3933/allow-passing-aliased-to
最后的答案是:
session.query(MyTable).select_entity_from(
text('SELECT * FROM my_view').columns(*MyTable.__table__.columns)).\
filter(MyTable.pk=='abc')