python - SQLAlchemy 1.4 ORM 中 Query.count 的等价物是什么?
问题描述
给定这样的 SQLAlchemy ORM 模型
class Foo(Base):
__tablename__ = 'foo'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String())
在 SQLAlchemy 1.4 / 2.0 中,ORM 的session.query
习语与 SQLAlchemy 核心select
功能*统一,所以要获取所有Foo
s 我们会做
foos = session.execute(Foo).scalars().all()
代替
foos = session.query(Foo).all()
在当前的 (sqlalchemy<=1.3) ORM 中,我们可以Foo
通过这个查询获得数据库中 s 的数量:
nfoos = session.query(Foo).count()
但是我们如何在 SQLALchemy 1.4 中获得计数呢?
session.execute(sa.select(Foo).count())
提高
AttributeError:“选择”对象没有属性“计数”
session.execute(sa.select(Foo)).count()
提高
AttributeError:“ChunkedIteratorResult”对象没有属性“count”
session.execute(sa.select(sa.func.count(Foo)))
提高
sqlalchemy.exc.ArgumentError:需要 SQL 表达式元素,得到
<class '__main__.Foo'>
。
这行得通,
session.execute(sa.select(sa.func.count(Foo.id))).scalars()
但是指定一个属性似乎不如Query.count
版本那么 OO / 优雅。此外,它排除了构建查询,但推迟了是否检索计数或模型实例的决定。
count()
在新的 SQLAlchemy 1.4 世界中获取 ORM 查询的惯用方法是什么?
* session.query()
API 在 1.4 及更高版本中仍然有效
解决方案
根据Ilja Everilä的评论,似乎在 SQLAlchemy 1.4 中发布的新 ORM 查询 API中没有直接等效于Query.count的内容(在撰写本文时处于测试阶段)。
等效的功能是调用count()
,从子查询中选择*
from sqlalchemy import func, select
count = (
session.execute(select(func.count()).select_from(select(Foo).subquery()))
.scalar_one()
)
生成此 SQL
SELECT count(*) AS count_1
FROM (SELECT foo.id AS id, foo.name AS name
FROM foo)
AS anon_1
统计一个属性,比如主键列,生成一个简单的SELECT COUNT
count = session.execute(select(func.count(Foo.id))).scalar_one()
SELECT count(foo.id) AS count_1
FROM foo
Query.count
在 1.4 中仍然支持,所以它仍然可以使用,就像 1.3 中可用的所有 ORM 功能一样。
*Query.count
也从子查询中选择而不是SELECT COUNT
直接执行。
推荐阅读
- python - 如何使用 python 获取停用词列表
- javascript - 如何创建一个指向特定页面的链接,等待 3 秒,然后自动点击当前页面上的内部链接?
- xml - 使用 XPath 获取带有命名空间的 XML 节点
- python - 文本分类方法
- google-api - Google 通讯录 API“无效请求”。更改名称时出现 400 错误
- android - Nativescript 插件,包括 Android SDK 而不是 aar
- excel - 为什么代码没有点击按钮?
- c# - 将 DeflateStream 文件内容发送到 Azure 消息队列
- matlab - 如何从另一个函数定义变量?
- reactjs - this.SetState 在多次调用中未定义