2016-09-28 3 views
1

чем разница между использованием scoped_session явным образом:Разница между SQLAlchemy scoped_session (..) и scoped_session (..)()

engine = create_engine(url) 
session = scoped_session(sessionmaker(bind=engine)) 

session.add(..) 
session.commit() 
session.remove() 

session.add(..) 
session.commit() 
session.remove() 

и создание экземпляра объекта scoped_session:

engine = create_engine(url) 
session = scoped_session(sessionmaker(bind=engine)) 

session().add(..) 
session().commit() 
session.remove() 

session().add(..) 
session().commit() 
session.remove() 

Sqlachemy всегда возвращают один и тот же сеанс для одного и того же потока, вызывая session():

>> session() is session() 
True 
>> session is session() 
False 

Является ли это подходящим способом управления соединением в многопоточной среде? Если да, то почему sqlalchemy позволяет запрашивать с использованием session вместо session()?

ответ

1

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

Таким образом, хотя вы вызываете session() несколько раз, он фактически не создает несколько сеансов, но каждый раз возвращается один и тот же.

Я рекомендую использовать капитал S для обозначения того факта, что сессия является фабрикой, а не экземпляром объекта.

Больше документации здесь, входя в гораздо более подробно, чем я сделал: http://docs.sqlalchemy.org/en/latest/orm/contextual.html

EDIT: Оба способа будут получать доступ к той же цели. Я всегда счел более ясным создание экземпляра из scoped_session (не все заводы предоставляют такие функции), но оба будут обращаться к локальному объекту сеанса потока.

http://docs.sqlalchemy.org/en/latest/orm/contextual.html#implicit-method-access

+0

Осторожно с терминологией. Генератор в Python - это очень специфическая вещь; «фабрика» - это то, о чем вы говорите. – univerio

+0

"" scoped_session "возвращает объект-генератор, поэтому вы должны вызвать генератор для возврата экземпляра" - лучшая часть - это то, что мне не нужно, потому что оба работают: 'Session.commit()' и 'Session(). совершить() '. И вопрос в том, в чем разница? Может быть, 'Session(). Commit()' работает в многопотоке, а 'Session.commit()' нет? – User

+1

Обновлен мой ответ. В принципе, завод автоматически вернет правильную локальную сессию потока. Я нахожу эту функцию неясной, но для каждой своей. – ApolloFortyNine

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