Как использовать несколько сеансов в приложении pylons?

Я прочитал "Несколько подключений к базе данных с помощью Python + Pylons + SQLAlchemy" и я понял, как создать несколько движков, используя эту технику, но теперь я ищу совета, как справиться с созданием Session для этих движков. Прямо сейчас Session в моем проекте определяется в соответствии с соглашением Pylons: myapp.model.meta.Session = scoped_session(sessionmaker()) и импортируется как myapp.model.Session. Это прекрасно работает, если есть только один двигатель.

Каков хороший, поддерживаемый подход к определению этого для нескольких двигателей? Набор движков может меняться во время выполнения, что бы это ни стоило, поэтому мне нужна возможность создавать новые Session на лету, без их жесткого кодирования в модели.


person Chris R    schedule 03.08.2010    source источник


Ответы (2)


Если вы хотите выбрать серверную часть базы данных для одного запроса, хорошим вариантом является вызов meta.Session(bind=get_engine_for_this_request()) в первую очередь. Это создаст сеанс с указанными параметрами. Вы можете вставить это в BaseController, если это имеет смысл в вашем случае.

Для нескольких бэкэндов на один запрос лучший подход зависит от вашего конкретного варианта использования. Если все серверные части имеют одинаковую схему, возможно, лучше создать несколько ScopedSessions, по одной для каждой серверной части. Когда они содержат разные схемы, вы можете создать несколько объектов MetaData (или базовых классов в случае декларативных) и привязать их к механизмам.

person Ants Aasma    schedule 05.08.2010

Используйте параметр bind для sessionmaker для привязки сеанса к определенному соединению.

См. http://www.sqlalchemy.org/docs/05/reference/orm/sessions.html#sqlalchemy.orm.sessionmaker для получения дополнительной информации.

person Gintautas Miliauskas    schedule 04.08.2010
comment
Я знаю, как связывать сеансы; это не новость. Мне нужно управлять несколькими моделями, связанными с разными сеансами и движками в одном приложении. - person Chris R; 04.08.2010
comment
О, тогда извините, я неправильно понял вопрос. Я думаю, что ответ сильно зависит от архитектуры вашего приложения. Я бы, вероятно, спрятал ссылки на сеансы и связанные модели в словаре с двигателем в качестве ключа и использовал его во всем коде. - person Gintautas Miliauskas; 05.08.2010