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 的经验得出的。我很想听听其他人怎么说。
小智 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 方面拥有多年的经验。