SQLAlchemy:在选择

时间:2017-03-09 17:13:01

标签: view sqlalchemy

我正常选择:

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';"

2 个答案:

答案 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')