SQLAlchemy的官方教程提供了使用会话系统的示例,例如:
>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)
许多非官方的教程也利用了会话,但是有些根本不使用会话,而是选择了一种称为这种方法的东西:
e = create_engine('sqlite:///company.db')
conn = e.connect()
query = conn.execute("SELECT first_name FROM employee")
当这个简单得多的系统似乎做同样的事情时,为什么根本需要会话?据我所知,官方文档并未阐明为什么这样做是必要的。
SQLAlchemy官方文档中有一个特别相关的部分:
Web应用程序是最简单的情况,因为这样的应用程序已经围绕一个一致的范围进行了构建-这是请求,它表示来自浏览器的传入请求,处理该请求以制定响应,最后交付回复给客户。因此,将Web应用程序与Session集成是将Session的范围与请求的范围链接起来的直接任务。可以在请求开始时建立会话,也可以使用惰性初始化模式来建立会话,该初始化模式会在需要时立即建立会话。然后,请求继续进行,并且某个系统就位,其中应用程序逻辑可以按照与访问实际请求对象的方式关联的方式访问当前会话。随着请求的结束,会话也被拆除,通常通过使用Web框架提供的事件挂钩来实现。Session所使用的事务也可以在此时进行提交,或者应用程序可以选择显式的提交模式,仅针对那些有保证的请求进行提交,但始终始终无条件地终止Session。
...和...
一些Web框架包括一些基础结构,以帮助完成使Session的寿命与Web请求的寿命保持一致的任务。这包括与Flask Web框架结合使用的产品,例如Flask-SQLAlchemy和通常与Pyramid框架一起使用的Zope-SQLAlchemy。SQLAlchemy建议使用这些产品。
不幸的是,我仍然无法确定我是否需要使用会话,或者最后一段是否暗示着某些实现(例如Flask-SQLAlchemy)已经在自动管理会话。
我需要使用会议吗?不使用会话是否存在重大风险?因为使用Flask-SQLAlchemy,我已经在使用会话了吗?
如您所指出的,如果仅使用纯SQLAlchemy Core构造和执行查询,则会话并不是严格必需的。但是,它们提供了利用SQLAlchemy ORM所需的更高的抽象层。会话维护修改后的模型的图形,并确保在必要时将更改有效且一致地刷新到数据库。
由于您已经使用过Flask-SQLAlchemy,因此即使您不需要ORM功能,我也看不到避免会话的理由。该扩展程序处理隔离请求所需的所有管道,因此您不必重新设计轮子,而是可以专注于应用程序代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句