如何记住查询SQLAlchemy关系(实现缓存)的结果?
问题描述:
假设我有一个映射类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