Лучший способ интеграции SqlAlchemy в проект Django

Я изменил приложение 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?

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

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

Ответ 1

для первых двух, 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