Лучший способ интегрировать SqlAlchemy в проект Django - PullRequest
16 голосов
/ 07 июля 2011

Я изменил свое приложение Django для использования SQLAlchemy, и теперь оно работает.

Но мне интересно, куда мне поместить следующие строки:

engine = sqlalchemy.create_engine(settings.DATABASE_URL)
Session = sqlalchemy.orm.sessionmaker(bind=engine)
session = Session()

Причина, по которой я спрашиваюпотому что я хочу использовать SQLAlchemy во многих местах, и я не думаю, что это правильно / мощно / хорошо написано, чтобы вызывать эти три строки каждый раз, когда мне нужно использовать базу данных.

Место, где мне потребуется SAэто:

  • На мой взгляд, конечно
  • В некоторых промежуточных программах я написал
  • В моих моделях.Как и в get_all_tags для модели BlogPost.

То, что я считаю правильным, - это получить сеанс, повторно подключившись к базе данных, если сеанс закрыт, или просто вернув текущийподключенного сеанса, если он существует.

Как правильно использовать SQLAlchemy с моими приложениями Django?

Спасибо за вашу помощь!

Примечание.в мое приложение Django, но это не говорит мне точно, где поместить эти 3 строки (http://lethain.com/entry/2008/jul/23/replacing-django-s-orm-with-sqlalchemy/).

1 Ответ

24 голосов
/ 07 июля 2011

для первых двух, engine и Session, вы можете поместить их в settings.py;они, конфигурация, в конце концов.

На самом деле создание сеанса требует немного большей осторожности, поскольку session по сути является «транзакцией».Самое простое, что нужно сделать, - это создать его в каждой функции представления, когда это необходимо, и зафиксировать их непосредственно перед возвратом.Если вы хотите немного больше магии, чем это, или если вы хотите / должны использовать сеанс вне функции представления, вам следует вместо этого определить middleware , что-то вроде

class MySQLAlchemySessionMiddleware(object):
    def process_request(self, request):
        request.db_session = settings.Session()

    def process_response(self, request, response):
        try:
            session = request.db_session
        except AttributeError:
            return response
        try:
            session.commit()
            return response
        except:
            session.rollback()
            raise

    def process_exception(self, request, exception):
        try:
            session = request.db_session
        except AttributeError:
            return
        session.rollback()

Тогда каждое представление будет иметь в своих запросах атрибут db_session, который они могут использовать по своему усмотрению, и все, что было добавлено, будет зафиксировано после завершения ответа.забудьте добавить промежуточное ПО к MIDDLEWARE_CLASSES

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