【问题标题】:SQLAlchemy: substitute a view for a table when selectingSQLAlchemy:选择时用视图替换表
【发布时间】:2017-03-09 17:13:00
【问题描述】:

我有一个正常的选择:

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

【问题讨论】:

    标签: view sqlalchemy


    【解决方案1】:

    进一步挖掘让我更接近答案,但没有快乐。在这里发布进展以防引起进一步的思考:

    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

    【讨论】:

      【解决方案2】:

      提交了我认为是错误的内容: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')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 2019-05-26
        • 1970-01-01
        相关资源
        最近更新 更多