Могу ли я использовать Flask-SQLAlchemy и 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 ответ

Решение

У вас есть приложение, как:

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()".

Просто не делите сеансы или объекты между потоками, я бы сказал, иначе все станет грязно. Поделитесь идентификаторами, и все в порядке.

Другие вопросы по тегам