如何使用SELECT count(*)和SQLAlchemy计算行数?

2024-05-29 04:53:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否可以在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中要慢得多。我正在寻找一个不需要表具有已知主键的解决方案,如Get the number of rows in table using SQLAlchemy中所建议的。


Tags: fromexecutesqlalchemysessionascounttable语句
3条回答

我需要对一个包含许多连接的非常复杂的查询进行计数。我使用连接作为过滤器,所以我只想知道实际对象的数量。count()不够,但我在这里的文档中找到了答案:

http://docs.sqlalchemy.org/en/latest/orm/tutorial.html

代码如下所示(计算用户对象):

from sqlalchemy import func

session.query(func.count(User.id)).scalar() 

我设法在两个层上用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)重置查询的顺序,这与计数无关。

使用此方法,您可以在任何ORM查询上拥有一个count(*),它将遵守所有已指定的filterjoin条件。

只查询一个已知列:

session.query(MyTable.col1).count()

相关问题 更多 >

    热门问题