首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存到水瓶之外的数据库-SQLAlchemy会话

保存到水瓶之外的数据库-SQLAlchemy会话
EN

Stack Overflow用户
提问于 2015-12-17 22:56:05
回答 1查看 910关注 0票数 1

我有一份长期的工作要做一份分析报告。我想开始这个工作,给用户一个永久的链接,然后允许用户刷新页面,看看他们的报告是否准备好了。报表的状态初始化为pending。作业完成后,我需要将状态保存到ready

我使用Python的threading模块开始这项工作。问题是,当我保存状态时,我不再处于有效的烧瓶-SQLAlchemy会话中。以下是错误:

RuntimeError: application not registered on db instance and no application bound to current context

这是密码:

代码语言:javascript
复制
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时引发错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-18 00:11:38

当您想要保存到数据库时,应该打开一个新会话。

我不知道你的session_scope()是做什么的。在我的一个项目中,我有这样的东西:

代码语言:javascript
复制
@contextmanager
def db_session():
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

然后,在一个帖子中,我可以做到:

代码语言:javascript
复制
with db_session() as session:
    # save to data base
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34345841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档