我正在建立一个小网站,我已经有所有的,我的模型在SQLAlchemy。该网站将发布一些信息,从一些计算是脱机完成的。只有结果将发布到一个精简的数据库,即它包含的结果,而不是原始数据,但网站需要查询的结果。
我将使用烧瓶,因为我的模型已经使用Python驱动(以及一些C++通过SWIG进行的繁重工作),我不想使用Django。
现在我已经问过这个问题了,我敢肯定,没有太多理由的通常的咒语是“使用烧瓶-SQLAlchemy”。问题是为什么?
如果我编写了一些自己处理的会话,为什么我必须在中重新定义我的数据库这一附加层。除了在我的烧瓶应用程序中编写一些类似这里的代码以外:
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
db = getattr(g, 'db', None)
if db is not None:
db.close()我还需要担心什么?默认情况下,SQLAlchemy甚至为我做连接池。
发布于 2016-10-15 09:27:31
实际上,您正在使用Flask构建一个web应用程序,该应用程序通过sqlalchemy完成与数据库相关的各种操作。因此,当您使用应用程序处理的多个请求处理数据库会话时,您必须确定,您正在谨慎地创建和关闭会话。
如果您阅读SQLAlchemy 文档,则建议将会话的生命周期与访问和/或操作数据库数据的函数和对象分隔开来。这将大大有助于实现可预测和一致的事务范围。
web应用程序是最简单的情况,因为这样的应用程序已经围绕单个一致的作用域构建--这是
request,它表示来自浏览器的传入请求,处理该请求以形成响应,最后将该响应传递回客户端。然后,将web应用程序与Session集成是将Session的作用域与请求的作用域联系起来的直接任务。Session可以在请求开始时建立,也可以使用延迟初始化模式,这种模式可以在需要时立即建立。然后,请求继续进行,在某个系统中,应用程序逻辑可以以与如何访问实际请求对象相关联的方式访问当前会话。当请求结束时,Session也会被撕毁,通常是通过使用web框架提供的事件挂钩。会话使用的事务也可以在此时提交,或者应用程序也可以选择显式提交模式,只对需要提交的请求进行提交,但始终在结束时无条件地删除Session。
用外行人的话来说,我的意思是
在
SQLAlchemy中,之所以提到上述操作,是因为web应用程序中的会话应该是作用域的,这意味着每个请求处理程序都会创建和销毁自己的会话。 这是必要的,因为web服务器可以是多线程的,因此可以同时处理多个请求,每个请求处理不同的数据库会话。
这意味着,如果您使用SqlAlchemy和Flask,您必须像创建scoped session一样手动处理会话,并在每个请求中谨慎地删除它们,否则您可能陷入困境,这给您的web应用程序增加了额外的复杂性。
但是,还有Flask-SqlAlchemy ( sqlalchemy库的扩展,用于Flask应用程序),它提供了基础设施,以帮助完成将Session的寿命与每个web请求的寿命相一致的任务。实际上,您还可以发现,在SqlAlchmey 文档中,它们还建议将其与Flask一起使用。
Flask-SQLAlchemy为每个请求创建一个新的/新的scoped session。如果再深入挖掘,您会在这里发现,它还在app.teardown_appcontext (用于>=0.9)、app.teardown_request (用于Flask0.7-0.8)、app.after_request (用于容器<0.7)上安装了一个钩子,并在这里调用了db.session.remove()。
发布于 2015-01-27 11:50:30
您在问题中输入的代码实际上并不适用于Sqlalchemy集成是Flask。我知道这只是个例子,但以防万一。
对于Sqlalchemy集成,您需要做的就是确保在请求结束时清除当前的DbSession,方法如下:
@app.teardown_appcontext
def shutdown_session(exception=None):
DbSession.remove()其中DbSession是作用域会话。
当你不想使用水瓶-Sqlalchemy包时,请使用这是文档。
https://stackoverflow.com/questions/28168554
复制相似问题