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

Sri*_*ati 8 flask flask-sqlalchemy

我正在协助一个使用flask-sqlalchemy的项目.我想要一个db查询来计算表中的记录数.可以直接使用table.query.filter_by(condition).count()或者我需要什么加.请帮助我.我是个乞丐.谢谢!

Tre*_*ang 16

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

session.query(Class_name).filter_by(condition).count()
Run Code Online (Sandbox Code Playgroud)

Class_name是表的映射类的名称.


Log*_*ram 11

给定的答案都没有专门针对flask-sqlalchemy,您将在其中使用给出的示例:

Table.query.filter_by(condition).count()
Run Code Online (Sandbox Code Playgroud)

您可以.count()不使用过滤器来执行:

Table.count()
Run Code Online (Sandbox Code Playgroud)

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

ParentTable.children.count()
Run Code Online (Sandbox Code Playgroud)

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

{{ Table.query.filter_by(condition).count() }}
Run Code Online (Sandbox Code Playgroud)

奖励积分(对于注重表现的人):

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

db.session.execute(Table.query.filter_by(condition).statement.with_only_columns([func.count()]).order_by(None)).scalar()
Run Code Online (Sandbox Code Playgroud)

假设db是您的SQLAlchemy实例(即db = SQLAlchemy(app))。这很麻烦,但是可以节省一些大查询的开销。

  • 不要在 Postgres 中使用 .count:`Table.query.filter_by(condition).count()` 会生成:`SELECT COUNT(*) AS count_1 FROM ( SELECT table.field1, table.field2, ... table.fieldN WHERE条件) AS anon_1` `count` 在 postgres 中开始是不好的(因为 MVC postgres 不保留表的行计数),但是在子查询中执行它会定期触发最坏的情况。另请注意 SQL Alchemy 如何获取表中的每一行以传递给 count...更好使用:`db.session.query(db.func.count()).filter(condition).scalar()` (3认同)

ant*_*uan 6

是的,就是这样。但是请记住,“ count()”会再进行一次查询,如下所示:

Select count(q.*) from (select * from table) q
Run Code Online (Sandbox Code Playgroud)

这不是最优化的。您可以使用此:

from sqlalchemy.sql.functions import func
number = session.query(func.count(table.id).label('number').first().number
Run Code Online (Sandbox Code Playgroud)

SQL查询将如下所示:

Select count(table.id) from table
Run Code Online (Sandbox Code Playgroud)