如何使用SELECT COUNT(*)和SQLAlchemy对行进行计数?
我想知道是否可以SELECT COUNT(*) FROM
TABLE
在SQLAlchemy中生成一个语句而无需使用显式地请求它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获取表中的行数中所建议。
-
我设法在两层上使用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 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)
重置查询的顺序,这与计数无关。使用此方法,您可以
count(*)
在任何ORM查询上使用,这将满足所有已指定的filter
和join
条件。