如何使用SELECT COUNT(*)和SQLAlchemy对行进行计数?

发布于 2021-01-29 15:10:21

我想知道是否可以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获取表中的行数中所建议。

关注者
0
被浏览
169
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我设法在两层上使用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查询上使用,这将满足所有已指定的filterjoin条件。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看