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框架提供的事件挂钩。会话使用的事务也可以在此时提交,或者应用程序可以选择显式提交模式,仅提交那些有保证的请求,但仍然总是无条件地在末尾拆除会话。
...和...
一些Web框架包括协助完成任务的基础架构 将会话的生命周期与Web请求的生命周期对齐。这个 包括Flask-SQLAlchemy等产品,用于结合使用 与Flask Web框架和Zope-SQLAlchemy一起使用 金字塔框架。 SQLAlchemy建议这些产品 用作可用的。
不幸的是,我仍然不能告诉我是否需要使用会话,或者最后一段是否暗示某些实现(如Flask-SQLAlchemy)已经自动管理会话。
我需要使用会话吗?不使用会话会有很大的风险吗?我是否已经在使用会话,因为我使用的是Flask-SQLAlchemy?
答案 0 :(得分:1)
正如您所指出的,如果您只使用普通Web Animations API构造和执行查询,那么会话并不是绝对必要的。但是,它们提供了利用SQLAlchemy Core所需的更高层次的抽象。会话维护已修改模型的图形,并确保在必要时将更改有效且一致地刷新到数据库。
由于您已经使用了Flask-SQLAlchemy,即使您不需要ORM功能,我也没有理由避免会话。扩展程序处理隔离请求所需的所有管道,因此您不必重新发明轮子并可以专注于您的应用程序代码。
答案 1 :(得分:1)
如果您想使用ORM功能,则需要会话,包括:
更改查询返回的对象的某些属性,并将其轻松写回数据库
使用普通的python构造函数创建一个对象,并将其轻松发送回数据库
在对象上建立关系。因此,例如,如果您有一个博客,并且您有一个帖子对象,则可以编写post.author来访问负责该帖子的User对象。
我还要注意,即使你使用Session,你也不需要sessionmaker。在Web应用程序中,您可能需要它,但如果您正在寻找简单性,则可以使用这样的会话:
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
engine = create_engine(...)
session = Session(bind = engine)
同样,我认为您可能希望在您的应用中使用sessionmaker,但您不需要它来进行会话