如何记住查询SQLAlchemy关系(实现缓存)的结果?

问题描述:

假设我有一个映射类Article。它有一个关系category,每次我访问时都会执行查询(article.category将发出查询以获取categoryarticle)。如何记住查询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) 

难道你的代码的工作,否则默认情况下,请提供代码段。

+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

如果你真的只需要缓存的结果,见下文(非常类似的解决方案给你贴一个问题):

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 
    ...