简体   繁体   English

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

[英]Can I use Flask-SQLAlchemy and SQLAlchemy at the same time?

I've been using Flask-SQLAlchemy for a project for about a year. 我已经为一个项目使用Flask-SQLAlchemy大约一年了。 I like that it abstract away the sessioning for me. 我喜欢它为我简化了会话。 But now I need more granular control over my sessioning, namely to make a DB connection in a thread after the user has left my application. 但是现在我需要对会话进行更精细的控制,即在用户离开我的应用程序后在线程中建立数据库连接。 Is it possible / are there any dangers to use both Flask-SQLAlchemy and SQLAlchemy at the same time? 同时使用Flask-SQLAlchemy和SQLAlchemy是否有危险?

Bonus: if I must revert to just SQLAlchemy, what must I know? 奖励:如果我必须仅恢复到SQLAlchemy,我必须知道什么? Is it just session scope? 这只是会话范围吗?

EDIT trying detached 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

You have an app like: 您有一个类似的应用程序:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

Currently you use: 当前您使用:

@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)

But you can also use: 但您也可以使用:

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.'

By default a session is bound to a thread. 默认情况下,会话绑定到线程。 For this simple case you don't need to do any changes to your code at all, but if sessions are shared between threads, then you would need to do a few changes: “ Session and sessionmaker() ”. 对于这种简单的情况,您根本不需要对代码进行任何更改,但是如果会话在线程之间共享,则需要进行一些更改:“ Session and sessionmaker() ”。

Just don't share sessions or objects between threads I'd say, or things will get messy. 只是不要在我要说的线程之间共享会话或对象,否则事情变得混乱。 Share IDs and you're fine. 共享ID,就可以了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM