Scoped_session (sessionmaker()) или обычный sessionmaker() в sqlalchemy?
Я использую SQlAlchemy в своем веб-проекте. Что я должен использовать - scoped_session(sessionmaker())
или обычный sessionmaker()
- и почему? Или я должен использовать что-то еще?
## model.py
from sqlalchemy import *
from sqlalchemy.orm import *
engine = create_engine('mysql://dbUser:[email protected]:dbPort/dbName',
pool_recycle=3600, echo=False)
metadata = MetaData(engine)
Session = scoped_session(sessionmaker())
Session.configure(bind=engine)
user = Table('user', metadata, autoload=True)
class User(object):
pass
usermapper = mapper(User, user)
## some other python file called abc.py
from models import *
def getalluser():
session = Session()
session.query(User).all()
session.flush()
session.close()
## onemore file defg.py
from models import *
def updateuser():
session = Session()
session.query(User).filter(User.user_id == '4').update({User.user_lname: 'villkoo'})
session.commit()
session.flush()
session.close()
Я создаю объект session = Session()
для каждого запроса и закрываю его. Я делаю правильные вещи или есть лучший способ сделать это?
Ответы
Ответ 1
Рекомендуется прочитать документацию :
предусмотрена функция scoped_session()
, которая создает управляемый потоком реестр объектов Session
. Он обычно используется в веб-приложениях, так что единственная глобальная переменная может использоваться для безопасного представления транзакционных сеансов с наборами объектов, локализованными в одном потоке.
Вкратце, используйте scoped_session()
для обеспечения безопасности резьбы.
Ответ 2
Scoped_session для каждого метода, так как даст вам поток локального сеанса, который вы не можете получить заранее (например, на уровне модуля). Не нужно открывать новый сеанс в каждом методе, вы можете использовать глобальный сеанс, создать сеанс, только когда глобальная сессия недоступна. вы можете написать метод, который возвращает сеанс и добавляет его в init.py внутри вашего пакета.
Ответ 3
К вашему сведению, при использовании flask-sqlalchemy предоставленный объект сеанса по умолчанию является объектом сеанса с областью действия.
![enter image description here]()
http://flask-sqlalchemy.pocoo.org/2.3/quickstart/#road-to-enlightenment
Ответ 4
Я сам в этом разбираюсь, но я не эксперт.
Мои три пункта:
- Документы по SQLAlchemy предоставляют предложенный подход с использованием
scoped_session
, согласно приведенному выше комментарию г-на Клюева, по этой ссылке: http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#using-thread-local-scope-with-web-applications.
- В этом веб-расположении в документации по SQLAlchemy также говорится, что "... настоятельно рекомендуется использовать инструменты интеграции, предоставляемые с самой веб-платформой, если они доступны, вместо
scoped_session
".
- Например, Flask-SQLAlchemy утверждает, что позаботится об этом: http://pythonhosted.org/Flask-SQLAlchemy/quickstart.html#a-minimal-application