2010-02-28 66 views

回答

3

每當您在同一會話中訪問關係時,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) 

難道你的代碼的工作,否則默認情況下,請提供代碼段。

+0

哦。這不是我的意思。我的意思是記住會話之間的結果 - 通過某種可以緩存它們的代理來代理它們。這可以以某種方式完成嗎? – bodacydo 2010-02-28 20:34:45

+0

這不是問題的要求。如果你的對象不在會話中,記住關係的價值是什麼?例如,如果你想通過SA加載對象,然後分離它,並確保你已經加載了關係,在'relation'配置中使用'lazy = False'來加載它們。否則描述你的用例。 – van 2010-02-28 20:41:36

+0

看到我的其他答案,如果我現在明白你的問題... – van 2010-02-28 20:42:21

0

如果你真的只需要緩存的結果,見下文(非常類似的解決方案給你貼一個問題):

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 

但爲了有結果時,你的對象從會話分離您必須在分離之前調用此屬性。 (當parentNone時,它不處理情況。你是否總是有父母?)。

與渴望負載的選項simplier,一旦你加載對象,你應該有關係已加載(關鍵是要有lazy=False):

class MyChild(Base): 
    __tablename__ = 'MyChild' 
    id = Column(Integer, primary_key=True) 
    parent = relation('Parent', lazy=False) 
    # ... other mapped properties 
    ... 
相關問題