我可以同时使用Flask-SQLAlchemy和SQLAlchemy吗?

时间:2015-12-18 17:00:02

标签: python sqlalchemy flask-sqlalchemy

我已经将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

1 个答案:

答案 0 :(得分:2)

你有一个类似的应用程序:

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,你很好。