将SqlAlchemy集成到Django项目中的最佳方法

时间:2011-07-07 06:32:20

标签: python django sqlalchemy

我将Django应用程序更改为使用SQLAlchemy,现在可以正常工作。

但我想知道应该把这些行放在哪里:

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

我问的原因是因为我想在很多地方使用SQLAlchemy,而且我不认为每次我需要使用数据库时都要正确/强大/写好这三行。

我要求SA的地方是:

  • 在我的观点中,当然是
  • 在我编写的一些中间件中
  • 在我的模特中。与get_all_tags中的BlogPost模型类似。

我认为这是正确的,是通过在会话关闭时重新连接到数据库来获取会话,或者只是返回当前连接的会话(如果存在)。

如何在我的Django应用程序中正确使用SQLAlchemy?

感谢您的帮助!

注意:我已经按照本教程在我的Django应用程序中实现了SA,但是这个没有告诉我这三行的确切位置(http://lethain.com/entry/2008/jul/23/replacing-django-s-orm-with-sqlalchemy/)。

1 个答案:

答案 0 :(得分:24)

对于前两个engineSession,您可以将它们放入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