【发布时间】:2016-01-09 10:54:25
【问题描述】:
我正在协助一个使用 flask-sqlalchemy 的项目。我想要一个 db 查询来计算表中的记录数。我可以直接使用 table.query.filter_by(condition).count() 还是有什么我需要添加。请帮助我。我是初学者。提前谢谢!
【问题讨论】:
我正在协助一个使用 flask-sqlalchemy 的项目。我想要一个 db 查询来计算表中的记录数。我可以直接使用 table.query.filter_by(condition).count() 还是有什么我需要添加。请帮助我。我是初学者。提前谢谢!
【问题讨论】:
没有一个给出的答案专门针对 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))。这很拗口,但它会为您节省一些大查询的开销。
【讨论】:
Table.query.filter_by(condition).count() 产生:SELECT COUNT(*) AS count_1 FROM ( SELECT table.field1, table.field2, ... table.fieldN WHERE condition) AS anon_1 count 在 postgres 中不好开始(因为 MVC postgres 不保留表的行数),但是做它在子查询中定期触发最坏情况。另请注意 SQL Alchemy 如何获取表中的每一行以传递给计数...更好地使用:db.session.query(db.func.count()).filter(condition).scalar()
根据this source,以下内容应该适合您:
session.query(Class_name).filter_by(condition).count()
Class_name 是您的表的映射类的名称。
【讨论】:
是的,你可以这样做。但请记住,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) from table
【讨论】:
简单就是最好的:
accounts = db.session.execute('select count(id) as c from user').scalar()
【讨论】: