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_tags
BlogPost模型.我认为是正确的,是通过在会话关闭时重新连接到数据库来获取会话,或者只返回当前连接的会话(如果存在).
如何在我的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