如何在 Flask-sqlalchemy 中使用 count()

问题描述 投票:0回答:6

我正在协助一个使用flask-sqlalchemy的项目。
我想要一个数据库查询来计算表中的记录数。

我可以直接使用

table.query.filter_by(condition).count()
吗?
或者有什么需要补充的吗?

请帮助我。我是一个初学者。预先感谢!

flask flask-sqlalchemy
6个回答
51
投票

给出的答案都没有具体解决flask-sqlalchemy,您将在其中使用您给出的示例:

Table.query.filter_by(condition).count()

您可以在没有过滤器的情况下执行

.count()

Table.query.count()

您还可以使用 M2M 关系进行计数:

ParentTable.children.count()

您可以直接在 jinja 模板中使用其中任何一个,例如:

{{ Table.query.filter_by(condition).count() }}

奖励积分(注重表现):

.count()
有点慢(特别是对于 MySQL,由于子查询处理不当),因此,您可以使用如下所示的自定义计数:

db.session.execute(Table.query.filter_by(condition).statement.with_only_columns([func.count()]).order_by(None)).scalar()

假设

db
是您的 SQLAlchemy 实例(即
db = SQLAlchemy(app)
)。 虽然有点拗口,但它会为你节省一点大查询的开销。


30
投票

根据此来源,以下内容应该适合您:

session.query(Class_name).filter_by(condition).count()

Class_name 是表的映射类的名称。


7
投票

是的,你可以做到。但请记住,

count()
使用了另一个查询,如下所示:

Select count(q.*) from (select * from table) q

但是,您可以通过仅使用一个查询来提高效率。你可以用这个:

from sqlalchemy.sql.functions import func
number = session.query(func.count(table.id).label('number').first().number

SQL 查询将是这样的:

Select count(table.id) as number from table

0
投票

更新:SQLAlchemy 2.0

在 SQLAlchemy 2.0 中,已弃用查询对象的使用 SQLAlchemy 2.0 文档。以下代码对我有用(适应OP的问题):

with app.app_context():
        my_query = db.func.count(Table.id)
        number = db.session.execute(my_query).scalar()

上面的Table.id也可以用条件来代替;例如,在我的具体情况下,使用类 Cafe(),我使用了条件:Cafe.location == "Peckham"。在 OP 的情况下使用的合适条件取决于 Table 类。


0
投票

如文档中所述:

“您可能会看到使用 Model.query 或 session.query 来构建查询。该查询接口在 SQLAlchemy 中被认为是遗留的。更喜欢使用 session.execute(select(...)) 。”

推荐方式:

query = select(func.count()).select_from(TransactionModel).where(TransactionModel.category_id.__eq__(category_id))
count = db.session.execute(query).scalar()

-1
投票

简单就是最好的:

accounts = db.session.execute('select count(id) as c from user').scalar()
© www.soinside.com 2019 - 2024. All rights reserved.