SQLAlchemy Select 和 Query API 之间的区别

shi*_*asu 19 python sql orm sqlalchemy

不确定以前是否有人问过这个问题,但在 SQLAlchemy文档中,他们讨论了作为ORMselect()新功能的一部分引入。2.0 style以前(1.x style),该query()方法用于获取数据。这两者有什么区别?

例如,要在Users表中查询包含电子邮件和姓名的用户,我们可以在查询 API 中执行以下操作:

session.query(Users).filter_by(name='name', email='mail@example.com').first()
Run Code Online (Sandbox Code Playgroud)

在 Select API 中,同样会导致更多代码:

from sqlalchemy import select

query = select(Users).filter_by(name='name', email='mail@example.com')
user = session.execute(query).fetchone()
Run Code Online (Sandbox Code Playgroud)

与其他相比,使用其中一种是否有任何显着优势,例如性能提升?2.0 API 仍在积极开发中,但似乎他们的文档更倾向于选择 API,而不是“传统”查询 API。这是否只是试图弥合 ORM 和核心功能之间的差距?

Yaa*_*ler 15

最大的区别在于select语句的构造方式。新方法创建一个更加动态的select对象,因为它可以从其他 select 语句构造,无需显式子查询定义

# select from a subqeuery styled query
q = select(Users).filter_by(name='name', email='mail@example.com')
q = select(Users.name, Users.email).select_from(q)
Run Code Online (Sandbox Code Playgroud)

根据最新的可选 API,结果是更加“本机 SQL”的查询构造。可以在各种功能的语句中定义和传递查询,例如 where 子句、having、select_from、intersect、union 等。

性能方面,可能在 python 运行时(编译查询)方面有一些微小的好处,但与网络延迟 + 数据库工作相比可以忽略不计。

顺便说一句,很好的问题!我的回答是根据我使用 select API 的经验得出的。我很想听听其他人怎么说。

  • 我完全支持最后的声明 - 我只是偶然发现了同样的问题,并且非常期待有关此事的更多信息。感谢您的回复! (2认同)

小智 5

由于 1.4 SQLAlchemy 内部已经通过 select() API 实现了 query(),因此在性能方面应该差别很小。

在 1.4 版本中,所有 Core 和 ORM SELECT 语句都直接从 Select 对象呈现;当使用 Query 对象时,在语句调用时,它将其状态复制到 Select,然后使用 2.0 样式执行在内部调用。

https://docs.sqlalchemy.org/en/14/changelog/migration_14.html#change-5159

从历史上看,query() 和 select() 之间的区别是 query() 用于 ORM,而 select() 用于 Core。2.0 版本消除了 ORM 和 Core 之间的许多差异,并使它们的使用更加统一。比较 select() 和 query() 已经没有意义了。

虽然有一些向后兼容性,并且您不必立即采用 2.0 风格,但我认为在 1.4 和 2.0 中开始采用它是明智的。我这样做已经有一段时间了,发现它很容易习惯,而且与 1.x 风格相比很快就更直观了。但我现在使用 SQLAlchemy 才大约一年,并且在本机 SQL 方面拥有多年的经验。