假設我有一個映射類Article
。它有一個關係category
,每次我訪問時都會執行查詢(article.category
將發出查詢以獲取category
或article
)。如何記住查詢SQLAlchemy關係(實現緩存)的結果?
如何代理article.category
調用,以便從數據庫查詢結果,然後記住然後返回?
謝謝,Boda Cydo。
假設我有一個映射類Article
。它有一個關係category
,每次我訪問時都會執行查詢(article.category
將發出查詢以獲取category
或article
)。如何記住查詢SQLAlchemy關係(實現緩存)的結果?
如何代理article.category
調用,以便從數據庫查詢結果,然後記住然後返回?
謝謝,Boda Cydo。
每當您在同一會話中訪問關係時,SA是否真的發出查詢?海事組織,它不應該發生,因爲結果應自動緩存在會議內。
爲了檢查有沒有SQL
發出後,只要打開日誌記錄,並看到自己:
metadata.bind.echo = 'debug'
c = session.query(Child).first() # issues SELECT on your child table(s)
print "child: ", c
print "c.parent: ", c.parent # issues SELECT on your parent table, then prints
print "c.parent: ", c.parent # just prints (no SQL)
print "c.parent: ", c.parent # just prints (no SQL)
難道你的代碼的工作,否則默認情況下,請提供代碼段。
如果你真的只需要緩存的結果,見下文(非常類似的解決方案給你貼一個問題):
class MyChild(Base):
__tablename__ = 'MyChild'
id = Column(Integer, primary_key=True)
parent = relation('Parent')
# ... other mapped properties
def __init__(self):
_parent_cached = None
@property
def parent_cached(self):
if self._parent_cached is None:
self._parent_cached = self.parent
但爲了有結果時,你的對象從會話分離您必須在分離之前調用此屬性。 (當parent
爲None
時,它不處理情況。你是否總是有父母?)。
與渴望負載的選項simplier,一旦你加載對象,你應該有關係已加載(關鍵是要有lazy=False
):
class MyChild(Base):
__tablename__ = 'MyChild'
id = Column(Integer, primary_key=True)
parent = relation('Parent', lazy=False)
# ... other mapped properties
...
哦。這不是我的意思。我的意思是記住會話之間的結果 - 通過某種可以緩存它們的代理來代理它們。這可以以某種方式完成嗎? – bodacydo 2010-02-28 20:34:45
這不是問題的要求。如果你的對象不在會話中,記住關係的價值是什麼?例如,如果你想通過SA加載對象,然後分離它,並確保你已經加載了關係,在'relation'配置中使用'lazy = False'來加載它們。否則描述你的用例。 – van 2010-02-28 20:41:36
看到我的其他答案,如果我現在明白你的問題... – van 2010-02-28 20:42:21