我将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/)。
答案 0 :(得分:24)
对于前两个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