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

标签 python sqlalchemy flask-sqlalchemy

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

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

编辑尝试分离 session :

(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

最佳答案

您有一个应用程序,例如:

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 绑定(bind)到线程。对于这个简单的情况,您根本不需要对代码进行任何更改,但是如果 session 在线程之间共享,那么您需要进行一些更改:“Session and sessionmaker() ”。

只是不要在线程之间共享 session 或对象,否则事情会变得困惑。分享 ID 就可以了。

关于python - 我可以同时使用 Flask-SQLAlchemy 和 SQLAlchemy 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34360444/

相关文章:

python - 通过 SQLAlchemy 执行 Teradata MERGE 时不会产生任何结果

python - 如何使用 SQLAlchemy 在插入时解析相关的外键?

python - 在新的virtualenv中安装wheel软件包时,导入旧django项目模型的任何方法

python - 如何在python中运行c代码

python - 具有子集属性的 SQL 查询过滤器

python - sqlalchemy 对象如何分离?

python - 将 Flask-SQLAlchemy 中的模型分离到另一个文件会破坏 PyDev 导入检测

python - FlaskApp 没有属性 'config'

python - 在应用程序之间共享套接字有什么好处?

python - Python中有 'multimap'实现吗?