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

时间:2010-02-28 20:07:05

标签: caching sqlalchemy

假设我有一个映射的类Article。它有一个category关系,每次访问时都会执行查询(article.category会发出查询以获取categoryarticle

如何代理article.category调用,以便从数据库中查询结果,然后记住然后返回?

谢谢,Boda Cydo。

2 个答案:

答案 0 :(得分:3)

每次访问同一会话中的关系时,SA是否真的会发出查询? IMO,它不应该发生,因为结果应该在会话中自动缓存

为了检查没有发出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)

默认情况下,您的代码应该正常工作,请提供代码段。

答案 1 :(得分: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时,它也不处理情况。你总是有父母吗?)。

具有预先加载的选项更加简单,加载对象后,您应该已经加载了关系(关键是要lazy=False):

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