gpt4 book ai didi

python - 什么是SQLAlchemy 1.4 ORM中的Query.count?

转载 作者:行者123 更新时间:2023-12-03 16:31:53 24 4
gpt4 key购买 nike

给定这样的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,我们将执行此操作
foos = session.execute(Foo).scalars().all()
代替
foos = session.query(Foo).all()
在当前(sqlalchemy <= 1.3)ORM中,我们可以使用以下查询获取数据库中 Foo的数量:
nfoos = session.query(Foo).count()
但是,如何在SQLALchemy 1.4中获得计数呢?
session.execute(sa.select(Foo).count())
加薪

AttributeError: 'Select' object has no attribute 'count'

session.execute(sa.select(Foo)).count()
加薪

AttributeError: 'ChunkedIteratorResult' object has no attribute 'count'

session.execute(sa.select(sa.func.count(Foo)))
加薪

sqlalchemy.exc.ArgumentError: SQL expression element expected, got <class '__main__.Foo'>.


这行得通,
session.execute(sa.select(sa.func.count(Foo.id))).scalars()
但指定属性似乎比 Query.count版本少OO/优雅。而且,它阻止了构建查询,但是推迟了是否要检索计数或模型实例的决定。
在新的SQLAlchemy 1.4世界中,获取ORM查询的 count()的惯用方式是什么?

* session.query() API仍将在1.4及更高版本中运行

最佳答案

根据Ilja Everilä的评论,似乎在SQLAlchemy 1.4(在撰写本文时为beta)中发布的Query.count中没有直接等效于new ORM-querying API的内容。
功能上等效的是调用count(),从子查询中选择*

from sqlalchemy import func, select

count = (
session.execute(select(func.count()).select_from(select(Foo).subquery()))
.scalars()
.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))).scalars().one()
SELECT count(foo.id) AS count_1 
FROM foo
1.4中仍然支持 Query.count,因此它仍然可以使用,1.3中可用的所有ORM功能也可以使用。

* Query.count also selects from a subquery而不是直接执行 SELECT COUNT

关于python - 什么是SQLAlchemy 1.4 ORM中的Query.count?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65754023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com