2011-08-24 53 views
1

如果我有一個sqlalchemy映射的實例。我可以獲得與所述實例的屬性相對應的底層動態查詢對象嗎?映射屬性的基礎查詢

例如:

e = Employee() 
e.projects 

#how do I get a query object loaded with the underlying sql of e.projects 

回答

2

我想你在描述relationship()lazy="dynamic"屬性。像

class Employee(Base): 
    __table_name__ = "employees" 
    ... 

    projects = relationship(..., lazy="dynamic") 

這將導致Employee().project,而不是返回一個包含相關項目集合的sqlalchemy.orm.Query實例。但是,這意味着沒有(簡單)方法直接訪問集合。如果您仍然需要(最可能是你真的希望它是延遲加載,設置了兩個relationship()!而非

class Employee(Base): 
    __table_name__ = "employees" 
    ... 

    projects_query = relationship(..., lazy="dynamic") 
    projects = relationship(..., lazy="select") 

編輯:你說

我需要以某種方式獲得動態查詢一個已經懶惰的關係對象映射屬性。

假設我們由酒店有相關的一類BarFoo的實例i 10。首先,我們需要獲得處理關係的財產。

from sqlalchemy.orm.attributes import manager_of_class 
p = manager_of_class(Foo).mapper.get_property('bars') 

我們想的是and_š在一起的所有列上i,它涉及到bars的表達式。如果您需要通過別名在Foo上操作,請在此替換它。

e = sqlalchemy.and_(*[getattr(Foo, c.key) == getattr(i, c.key) 
         for c in p.local_side]) 

現在我們可以創建一個表達這種關係的查詢。根據需要替換FooBar的別名。

q = session.query(Foo) \ 
      .filter(e) \ 
      .join(Foo.bars) \ 
      .with_entities(Bar) 
+0

這正是我所需要的。但是,我希望在實例和映射完成後從現有屬性動態生成該屬性。 我需要某種方式來獲取已經懶惰的關係映射屬性的動態查詢對象。 任何線索? – Ahmed

+0

謝謝TokenMacGuy !!多聰明的解決方案!不能等待在代碼中嘗試這個! :) – Ahmed

0

不知道對一般的問題,但你絕對可以通過設置echo=True,當你試圖獲取屬性的值將盡快登錄SQL語句使SQL日誌記錄。
取決於您的relationship配置,它可能已被熱切預加載。