【发布时间】:2013-11-06 16:59:24
【问题描述】:
我的代码结构如下:
project
--app
----utils
------util.py
----__init__.py
----models.py
--tests
----__init__.py
在测试/__init__.py 中,我有代码通过从 app/__init__.py 导入所有代码来初始化应用程序(烧瓶,如果这很重要)和数据库会话。我可以在 tests/__init__.py 中创建模型、查询和访问 backrefs 的实例。以下形式的代码可以正常工作:
objs = SomeModel.query.all()
for o in objs:
o.backref
但是,如果我这样做:
from utils.util import some_function
objs = SomeModel.query.all()
for o in objs:
some_function(o)
其中 some_function 只是访问一个反向引用
def some_function(obj):
obj.backref
我收到类似DetachedInstanceError: Parent instance <SomeModel at 0x2c1fe10> is not bound to a Session; lazy load operation of attribute 'backref' cannot proceed的错误
阅读 sqlalchemy 文档表明我需要将对象重新关联到数据库会话。我这样做了,看起来它可以工作(即运行该函数不会因先前的错误而失败):
import db_session
def some_function(obj):
db_session.add(obj)
obj.backref
那么,一个对象究竟是什么时候分离的呢?似乎只是将对象传递给另一个模块中的函数就会将其与会话分离。对象是否不知道与其关联的 sqlalchemy 会话?我试图避免使用db_session.add(obj),这似乎是很多样板代码。
【问题讨论】:
-
我无法在类似的代码上得到相同的结果。您能否提供最少的代码来重现您遇到的相同错误错误?
-
some_function 函数是一个同步 celery 任务。很抱歉没有包括在内。当我用最少的代码重现问题时,我会进一步更新问题。
标签: python sqlalchemy flask flask-sqlalchemy