2015-12-18 7 views
1

Я использую Flask-SQLAlchemy для проекта около года. Мне нравится, что он абстрагирует сессию для меня. Но теперь мне нужно более детально контролировать мой сеанс, а именно, сделать соединение с БД в потоке после того, как пользователь покинул мое приложение. Возможно ли, есть ли какие-либо опасности для использования как Flask-SQLAlchemy, так и SQLAlchemy одновременно?Могу ли я использовать Flask-SQLAlchemy и SQLAlchemy одновременно?

Бонус: если я должен вернуться к SQLAlchemy, что я должен знать? Это просто сеанс?

EDIT пытается отдельные сессии:

(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 

ответ

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

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

+0

Я пробовал это, но все равно получаю ту же ошибку. Я не могу правильно отформатировать комментарий, но, пожалуйста, см. Мое редактирование. – gwg

+0

Я получил это для работы с помощью 'sessionmaker'. – gwg

Смежные вопросы