假设我有一个映射的类Article
。它有一个category
关系,每次访问时都会执行查询(article.category
会发出查询以获取category
或article
。
如何代理article.category
调用,以便从数据库中查询结果,然后记住然后返回?
谢谢,Boda Cydo。
答案 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
但是,为了在对象与会话分离时获得结果,必须在分离之前调用此属性。 (当parent
为None
时,它也不处理情况。你总是有父母吗?)。
具有预先加载的选项更加简单,加载对象后,您应该已经加载了关系(关键是要lazy=False
):
class MyChild(Base):
__tablename__ = 'MyChild'
id = Column(Integer, primary_key=True)
parent = relation('Parent', lazy=False)
# ... other mapped properties
...