如果我有一個sqlalchemy映射的實例。我可以獲得與所述實例的屬性相對應的底層動態查詢對象嗎?映射屬性的基礎查詢
例如:
e = Employee()
e.projects
#how do I get a query object loaded with the underlying sql of e.projects
如果我有一個sqlalchemy映射的實例。我可以獲得與所述實例的屬性相對應的底層動態查詢對象嗎?映射屬性的基礎查詢
例如:
e = Employee()
e.projects
#how do I get a query object loaded with the underlying sql of e.projects
我想你在描述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")
編輯:你說
我需要以某種方式獲得動態查詢一個已經懶惰的關係對象映射屬性。
假設我們由酒店有相關的一類Bar
類Foo
的實例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])
現在我們可以創建一個表達這種關係的查詢。根據需要替換Foo
和Bar
的別名。
q = session.query(Foo) \
.filter(e) \
.join(Foo.bars) \
.with_entities(Bar)
不知道對一般的問題,但你絕對可以通過設置echo=True,當你試圖獲取屬性的值將盡快登錄SQL語句使SQL日誌記錄。
取決於您的relationship
配置,它可能已被熱切預加載。
這正是我所需要的。但是,我希望在實例和映射完成後從現有屬性動態生成該屬性。 我需要某種方式來獲取已經懶惰的關係映射屬性的動態查詢對象。 任何線索? – Ahmed
謝謝TokenMacGuy !!多聰明的解決方案!不能等待在代碼中嘗試這個! :) – Ahmed