如何使用 SQLAlchemy 使用 SELECT COUNT(\*) 计算行数?

新手上路,请多包涵

我想知道是否可以在 SQLAlchemy 中生成 SELECT COUNT(*) FROM TABLE 语句,而无需使用 execute() 明确要求它。如果我使用:

session.query(table).count()

然后它会产生类似的东西:

 SELECT count(*) AS count_1 FROM
    (SELECT table.col1 as col1, table.col2 as col2, ... from table)

这在带有 InnoDB 的 MySQL 中要慢得多。我正在寻找一种不需要表具有已知主键的解决方案,如 使用 SQLAlchemy 获取表中的行数中 所建议的那样。

原文由 tiho 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

我设法在两层上使用 SQLAlchemy 呈现以下 SELECT。

 SELECT count(*) AS count_1
FROM "table"

SQL 表达式层的用法

from sqlalchemy import select, func, Integer, Table, Column, MetaData

metadata = MetaData()

table = Table("table", metadata,
              Column('primary_key', Integer),
              Column('other_column', Integer)  # just to illustrate
             )

print select([func.count()]).select_from(table)

ORM 层的用法

你只需 Query (你可能有)并提供一个专门的 count() 方法,就像这个。

 from sqlalchemy.sql.expression import func

class BaseQuery(Query):
    def count_star(self):
        count_query = (self.statement.with_only_columns([func.count()])
                       .order_by(None))
        return self.session.execute(count_query).scalar()

请注意 order_by(None) 重置查询的顺序,与计数无关。

使用此方法,您可以在任何 ORM 查询中使用 count(*) ,这将遵循已指定的所有 filterjoin 条件。

原文由 pi. 发布,翻译遵循 CC BY-SA 4.0 许可协议

query = session.query(table.column).filter().with_entities(func.count(table.column.distinct())) count = query.scalar()

这对我有用。

给出查询: SELECT count(DISTINCT table.column) AS count_1 FROM table where …

原文由 gladiator 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题