【问题标题】:Can I use Flask-SQLAlchemy and SQLAlchemy at the same time?我可以同时使用 Flask-SQLAlchemy 和 SQLAlchemy 吗?
【发布时间】:2015-12-24 20:06:37
【问题描述】:

我已经在一个项目中使用 Flask-SQLAlchemy 大约一年了。我喜欢它为我抽象出会话。但是现在我需要对我的会话进行更精细的控制,即在用户离开我的应用程序后在线程中建立数据库连接。同时使用 Flask-SQLAlchemy 和 SQLAlchemy 是否可能/有任何危险吗?

奖励:如果我必须恢复到 SQLAlchemy,我必须知道什么?它只是会话范围吗?

编辑尝试分离会话:

(pdb) db
<SQLAlchemy engine=None>
(Pdb) db.session
<sqlalchemy.orm.scoping.scoped_session object at 0x104b81210>
(Pdb) db.session()
*** RuntimeError: application not registered on db instance and no application bound to current context

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    你有一个类似的应用:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    db = SQLAlchemy(app)
    

    目前你使用:

    @app.route('/add-some-item', method=['POST'])
    def add_some_item():
        some_item = SomeItem(foo=request.form.get('foo'))
        db.session.add(some_item)
        db.session.commit()
        return 'The new id is: {}'.format(some_item.id)
    

    但你也可以使用:

    def i_run_in_some_other_thread():
        # no need for a Flask request context, just use:
        session = db.session()  # a bare SQLAlchemy session
        ...
        some_item = SomeItem(foo=bar)
        session.add(some_item)
        session.commit()
    
    @app.route('/do-a-cron-job')
    def do_a_cron_job()
        Thread(target=i_run_in_some_other_thread).start()
        return 'Thread started.'
    

    默认情况下,会话绑定到线程。对于这种简单的情况,您根本不需要对代码进行任何更改,但如果会话在线程之间共享,则需要进行一些更改:“Session and sessionmaker()”。

    我想说的是,不要在线程之间共享会话或对象,否则事情变得一团糟。分享 ID,你就没事了。

    【讨论】:

    • 我试过这个,但仍然得到同样的错误。我无法正确格式化评论,但请查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2021-10-02
    相关资源
    最近更新 更多