Различия между сессиями в пилонах и пирамиде - PullRequest
7 голосов
/ 18 мая 2011

Как пользователь Pylons, я пытаюсь перейти на Pyramid, чтобы понять различия.

В Pylons меня использовали для определения Session в myproj.model.meta как:

Session = scoped_session(sessionmaker())

затем импортируйте его в myproj.model, чтобы определить модель и т. Д., Затем в приложении обратитесь к:

root = Session.query(MyModel).filter(...)...

теперь, используя шаблон по умолчанию в Pyramid (pyramid_routesalchemy), я определяю сессию, как и раньше (за исключением вызова DBSession и добавления расширения):

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

но в views.py я не использую его напрямую, а создаю его экземпляр:

dbsession = DBSession()
root = dbsession.query(MyModel).filter(...)...

Почему? В чем различия?


Более того, чем отличаются пирамиды от

import transaction
...
model = MyModel(name=u'root', value=55)
session.add(model)
session.flush()
transaction.commit()

в пилоны

model = MyModel(name=u'root', value=55)
session.add(model)
session.commit()

Ответы [ 2 ]

10 голосов
/ 18 мая 2011

На самом деле способ поиска экземпляра сеанса sqlalchemy для запросов на самом деле не имеет ничего общего с пилонами и / или пирамидой.Пилоны, возможно, предложили один из способов как «стандартный» путь пилонов, но это все.Единственное реальное различие между способами получения вашего сеанса - это пример использования ZopeTransactionExtension.

ZopeTransactionExtension - это небольшая часть, которая гарантирует, что каждый открываемый сеанс присоединяется к активной транзакции.Таким образом, если вы откроете 5 сеансов, они все присоединятся к одной и той же транзакции.Таким образом, если вы фиксируете или откатываете транзакцию, вся работа, проделанная любой из 5 сессий, последует их примеру.Модуль транзакции ("action.commit () ") является ключевым здесь.

pyramid_tm пытается упростить настройку транзакции ... она запускает одну после ввода запроса, все сеансы базы данных с областью действия присоединяются к ней ...и затем в конце запроса, если он обнаружит ошибку, он выполнит откат транзакции.В противном случае транзакция будет совершена.Таким образом, код уровня представления никогда не должен создавать или закрывать / фиксировать / откатывать транзакцию вручную.

В основном session.flush () предназначен для того, чтобы убедиться, что экземпляры модели базы данных заполняют свои первичные ключи без фиксации транзакции..

Таким образом, в представлении все, что вам нужно сделать, это:

def myview(request):
    session = DBsession()
    session.add(model)

pyramid_tm обеспечит фиксацию сеанса или его откат.

0 голосов
/ 04 августа 2011

Для справки, мне кажется, что выполнение dbsession.flush () работает хорошо для меня (это вызывает фиксацию сеанса), и мне не нужно иметь дело с дополнительным импортом.

...