我正在协助一个使用flask-sqlalchemy的项目。
我想要一个数据库查询来计算表中的记录数。
我可以直接使用
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)
)。 虽然有点拗口,但它会为你节省一点大查询的开销。
是的,你可以做到。但请记住,
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
更新: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 类。
如文档中所述:
“您可能会看到使用 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()
简单就是最好的:
accounts = db.session.execute('select count(id) as c from user').scalar()