scoped_session (session_maker ()) или обычный session_maker () в sqlalchemy? - PullRequest
28 голосов
/ 29 июня 2011

Я использую SQlAlchemy в своем веб-проекте.Что я должен использовать - scoped_session(session_maker()) или простой session_maker() - и почему?Или я должен использовать что-то еще?

## model.py
from sqlalchemy import *
from sqlalchemy.orm import *

engine = create_engine('mysql://dbUser:dbPassword@dbServer: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() объект для каждого запроса и закрываю его.Я поступаю правильно или есть лучший способ сделать это?

Ответы [ 4 ]

28 голосов
/ 29 июня 2011

Рекомендуется прочитать документацию :

предусмотрена функция scoped_session (), которая создает управляемый потоком реестр объектов Session.Он обычно используется в веб-приложениях, так что единственная глобальная переменная может использоваться для безопасного представления транзакционных сеансов с наборами объектов, локализованными в одном потоке.

Короче говоря, используйте scoped_session () для потокабезопасность.

9 голосов
/ 29 июня 2011

Scoped_session для каждого метода, поскольку он даст вам поток локальной сессии, который вы не можете получить заранее (как на уровне модуля). Не нужно открывать новую сессию в каждом методе. сеанс, только когда глобальный сеанс недоступен. Т.е. вы можете написать метод, который возвращает сеанс и добавить его к init .py внутри вашего пакета.

1 голос
/ 12 февраля 2019

К вашему сведению, при использовании flask-sqlalchemy предоставленный объект сеанса по умолчанию является объектом сеанса в области.

enter image description here

http://flask-sqlalchemy.pocoo.org/2.3/quickstart/#road-to-enlightenment

0 голосов
/ 21 апреля 2014

Я сам в этом разбираюсь, но я не эксперт.

Мои три пункта: (i) Документы по SQLAlchemy предоставляют предложенный подход с использованием scoped_session, согласно приведенному выше комментарию г-на Клюева, по этой ссылке: http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#using-thread-local-scope-with-web-applications. (ii) В этом месте в документации SQLAlchemy также говорится, что «... настоятельно рекомендуется использовать инструменты интеграции, предоставляемые с самой веб-платформой, если они доступны, вместо scoped_session». (iii) Flask-SQLAlchemy, например, утверждает, что позаботился об этом: http://pythonhosted.org/Flask-SQLAlchemy/quickstart.html#a-minimal-application

...