Sig*_*aud 1 python sqlalchemy flask flask-sqlalchemy
我正在构建一个小型网站,并且我已经在 SQLAlchemy 中拥有了所有模型。该网站将发布一些离线计算的信息。只有结果会发布到精简数据库,即包含结果,而不是原始数据,但网站需要查询结果。
我将使用 Flask,因为我的模型已经使用 Python 驱动(并且通过 SWIG 在 C++ 中进行了一些繁重的工作),并且我不想使用 Django。
现在,在我确定之前就有人问过这个问题,而没有太多理由的通常口头禅是“使用 Flask-SQLAlchemy”。问题是为什么?
如果我自己编写一些会话处理,为什么我必须在 Flask-SQLAlchemy 中重新定义数据库的附加层。除了必须在我的 Flask 应用程序中的某个地方编写一些代码之外:
@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()
Run Code Online (Sandbox Code Playgroud)
我还需要担心什么?SQLAlchemy 甚至默认为我提供连接池。
实际上,您正在构建一个 Web 应用程序,使用Flask
它来执行与数据库相关的各种操作sqlalchemy
。因此,当您处理具有应用程序处理的多个请求的数据库会话时,您必须确定您正在谨慎地创建和关闭会话。
如果您阅读SQLAlchemy 文档,他们建议将会话的生命周期与访问和/或操作数据库数据的函数和对象分开并置于外部。这将极大地有助于实现可预测且一致的交易范围。
Web 应用程序是最简单的情况,因为这样的应用程序已经围绕单个一致的范围构建 - 这就是
request
,它表示来自浏览器的传入请求,处理该请求以制定响应,最后交付该响应响应返回给客户端。将 Web 应用程序与 集成就是将 的范围链接到请求的Session
范围的简单任务。Session
可以Session
在请求开始时建立,或者使用惰性初始化模式,在需要时立即建立。然后,请求继续进行,其中应用程序逻辑可以以与实际请求对象的访问方式相关联的方式访问当前会话的某个系统。当请求结束时,Session
通常通过使用 Web 框架提供的事件挂钩来拆除。会话使用的事务也可以在此时提交,或者应用程序可以选择显式提交模式,仅提交那些有保证的请求,但仍然总是Session
在最后无条件地拆除。
用外行的话来说,我的意思是
在 中
SQLAlchemy
,提到上述操作是因为 Web 应用程序中的会话应该是有范围的,这意味着每个请求处理程序都会创建和销毁自己的会话。这是必要的,因为 Web 服务器可以是多线程的,因此可能会同时处理多个请求,每个请求都使用不同的数据库会话。
这意味着,如果您将SqlAlchemy与Flask一起使用,则必须手动处理会话(例如创建会话)scoped session
,并在每个请求上谨慎删除它们,否则您可能会陷入困境,这会为您的 Web 应用程序增加额外的复杂性。
但是,出现了(应用程序的sqlalchemy库Flask-SqlAlchemy
的扩展),它提供了基础设施来帮助完成将 a 的生命周期与每个 Web 请求的生命周期保持一致的任务。实际上,您还可以发现在SqlAlchmey文档中,他们也建议将其与.Flask
Session
Flask
Flask-SQLAlchemy为每个请求创建一个新的/新的scoped session
。如果你进一步挖掘它,你会发现这里,它还安装了一个钩子app.teardown_appcontext
(for Flask >=0.9), app.teardown_request
(for Flask 0.7-0.8), app.after_request
(for Flask <0.7),这里是它调用的地方db.session.remove()
。
归档时间: |
|
查看次数: |
3762 次 |
最近记录: |