Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 保存到SQLAlchemy会话之外的数据库_Python_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

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会话。