Sqlalchemy макет с приложением WSGI - PullRequest
4 голосов
/ 24 марта 2010

Я работаю над написанием небольшого WSGI-приложения, используя Bottle и SqlAlchemy, и меня смущает вопрос о том, каким должен быть «макет» моего приложения в терминах SqlAlchemy.

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

Любое понимание будет оценено.Примеры в документации, кажется, не делают это полностью ясным (если я не пропускаю что-то очевидное).Есть мысли?

Ответы [ 2 ]

6 голосов
/ 24 марта 2010

То, что вам нужно для достижения, хорошо описано в документации по пилонам: Определение таблиц и классов ORM :

Модель состоит из двух файлов: __init__.py и meta.py. __init__.py содержит определения таблиц и классы ORM, а также функцию init_model (), которая должна вызываться при запуске приложения. meta.py - это просто контейнер для вспомогательных объектов SQLAlchemy (Session, metadata и engine), которые будут использовать не все приложения.

Пример __init__.py показан в ссылке, тогда как meta.py выглядит примерно так:

from sqlalchemy import MetaData
from sqlalchemy.orm import scoped_session, sessionmaker
__all__ = ['Session', 'engine', 'metadata']
engine = None
Session = scoped_session(sessionmaker())
metadata = MetaData()

Вы можете считать этот модуль реализацией singleton, если хотите, так как он выполнит работу (загрузки и наличия одного экземпляра в большем количестве Pythonic ) за вас при первой загрузке модуля.

2 голосов
/ 24 марта 2010

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

from sqlalchemy import MetaData
from sqlalchemy.orm import scoped_session, sessionmaker

session = scoped_session(sessionmaker())
metadata = MetaData('sqlite://') # or whatever: creates the engine for you

Двигатель будет доступен как metadata.bind. Вам не нужно привязывать сеанс к движку - это необязательно, см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...