Python 保存到SQLAlchemy会话之外的数据库
我有一个长期的工作,建立一个分析报告。我想开始这项工作,给用户一个永久链接,然后允许用户刷新页面,看看他们的报告是否准备好了。报告的状态已初始化为Python 保存到SQLAlchemy会话之外的数据库,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我有一个长期的工作,建立一个分析报告。我想开始这项工作,给用户一个永久链接,然后允许用户刷新页面,看看他们的报告是否准备好了。报告的状态已初始化为挂起。作业完成后,我需要将状态保存到ready 我使用Python的threading模块开始这项工作。问题是,当我保存状态时,我不再处于有效的炼金术会话中。以下是错误: 运行时错误:应用程序未在db实例上注册,且没有绑定到当前上下文的应用程序 代码如下: from threading import Thread from app import db
挂起
。作业完成后,我需要将状态保存到ready
我使用Python的threading
模块开始这项工作。问题是,当我保存状态时,我不再处于有效的炼金术会话中。以下是错误:
运行时错误:应用程序未在db实例上注册,且没有绑定到当前上下文的应用程序
代码如下:
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
时会引发错误。您应该在希望保存到数据库时打开一个新会话
我不确定您的会话\u 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 base
我想知道。。。如果我在使用Flask SQLAlchemy,我甚至不需要我的
会话\u scope()
是吗?这是炼金术帮我解决的。我可以完全删除炼金术,只使用您的上下文管理器?我只使用它,但我不确定它在性能方面意味着什么。当流量很大时,可能会产生太多的db连接或其他问题。它当然有效,所以至少作为第一个解决方案,它已经足够好了;)无论如何,看看这个,它可能有用:(没有尝试过)FWIW,我使用我的作用域会话进行标准Flask SQLAlchemy事务,然后使用会话
工厂创建与HTTP会话无关的基本SQLAlchemy会话。