【问题标题】:How to use count() in Flask-sqlalchemy如何在 Flask-sqlalchemy 中使用 count()
【发布时间】:2016-01-09 10:54:25
【问题描述】:

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

【问题讨论】:

    标签: flask flask-sqlalchemy


    【解决方案1】:

    没有一个给出的答案专门针对 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))。这很拗口,但它会为您节省一些大查询的开销。

    【讨论】:

    • 这是真正的答案,也为 jinja 模板提供了一个很好的例子。谢谢
    • 不要在 Postgres 中使用 .count: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()
    【解决方案2】:

    根据this source,以下内容应该适合您:

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

    Class_name 是您的表的映射类的名称。

    【讨论】:

      【解决方案3】:

      是的,你可以这样做。但请记住,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
      

      【讨论】:

        【解决方案4】:

        简单就是最好的:

        accounts = db.session.execute('select count(id) as c from user').scalar()
        

        【讨论】:

        • OP 专门询问如何使用 ORM 而不是原始 SQL
        猜你喜欢
        • 2021-10-17
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 2020-12-28
        相关资源
        最近更新 更多