2017-03-09 78 views
0

當替補的視圖爲表我有一個正常的選擇:SQLAlchemy的:選擇

e = session.query(MyTable).filter(MyTable.pk=='abc').all() 

凡MyTable的映射到my_table以dB爲單位。

我也創建了數據庫中的派生視圖my_view具有完全相同的命名的列MY_TABLE。

有沒有辦法在查詢時在my_view以替代my_table,讓我從視圖中取回行?顯然,生成的對象只需要被讀取 - 我不打算改變它們。

所以基本上我想SQL是

FROM my_view AS my_table 

,而不是

FROM my_table 

隨着一切在查詢相同。

我不想再創建一個映射器,除非它可以自動某種程度上爲MyView的有60列一樣MyTable的完成。


更新:select_entity_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';" 

但是,只有以下擁有一支由實體:

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

進一步深挖已經讓我更接近答案,但沒有喜悅。在此情況下發布取得進展,徵求進一步的想法:

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