我有一份长期的工作要做一份分析报告。我想开始这个工作,给用户一个永久的链接,然后允许用户刷新页面,看看他们的报告是否准备好了。报表的状态初始化为pending。作业完成后,我需要将状态保存到ready。
我使用Python的threading模块开始这项工作。问题是,当我保存状态时,我不再处于有效的烧瓶-SQLAlchemy会话中。以下是错误:
RuntimeError: application not registered on db instance and no application bound to current context
这是密码:
from threading import Thread
from app import db
from app.models import Report
def build():
report = __save_and_detach_report(Report())
thread = Thread(target=__build, args=(report,))
thread.daemon = True
thread.start()
return report.id
def __build(report):
print('starting job')
time.sleep(10)
print('job complete')
__set_report_ready(report)
def __save_and_detach_report(report):
with session_scope() as session:
session.add(report)
session.commit()
session.expunge(report)
return report
def __set_report_ready(report):
with session_scope() as session:
report.ready()
session.merge(report)
@contextmanager
def session_scope():
try:
yield db.session
db.session.commit()
except Exception as e:
print 'Rolling back database'
print e
db.session.rollback()在调用merge时引发错误。
发布于 2015-12-18 00:11:38
当您想要保存到数据库时,应该打开一个新会话。
我不知道你的session_scope()是做什么的。在我的一个项目中,我有这样的东西:
@contextmanager
def db_session():
session = Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()然后,在一个帖子中,我可以做到:
with db_session() as session:
# save to data basehttps://stackoverflow.com/questions/34345841
复制相似问题