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

Cyr*_* N. 16 python django sqlalchemy

我改变了我的Django应用程序以使用SQLAlchemy,现在它可以工作了.

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

engine = sqlalchemy.create_engine(settings.DATABASE_URL)
Session = sqlalchemy.orm.sessionmaker(bind=engine)
session = Session()
Run Code Online (Sandbox Code Playgroud)

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

我要求SA的地方是:

  • 当然,在我看来
  • 在我写的一些中间件中
  • 在我的模特中.喜欢get_all_tagsBlogPost模型.

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

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

谢谢你的帮助!

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

Sin*_*ion 24

前两个,engine并且Session,你可以把它们放在settings.py; 毕竟,他们是配置.

实际上创建会话需要稍微小心点,因为a session本质上是一个"事务".最简单的方法是在需要时在每个视图函数中创建它,并在返回之前提交它们.如果你想要比这更神奇,或者如果你想/需要在视图函数之外使用会话,你应该改为定义一些中间件,比如

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()
Run Code Online (Sandbox Code Playgroud)

然后,每个视图将db_session在其请求中具有一个属性,他们可以根据需要使用这些属性,并且在响应完成时将添加任何已添加的内容.

不要忘记添加中间件 MIDDLEWARE_CLASSES

  • 连接池由`sqlalchemy.create_engine`的参数控制.感兴趣的参数是`poolclass`,其默认值为`QueuePool`,它将创建并重用最多5个(默认情况下)连接.如果您不想要或不需要自动提交行为,那么您可以更改配方arround,可以消除`process_response`,或在请求(或响应)上设置一个标志以指示是否需要提交.为了最大程度地控制资源的消耗,只需在需要会话时调用`Session()`. (3认同)
  • 如果在创建下一个会话之前对会话进行垃圾回收,则它可能只打开一个连接.但你的理解是合理的.您可以创建数千个会话,但最多可以向数据库打开5个连接(或者您选择的任何值) (3认同)