当前位置: 首页 > 面试题库 >

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

盖昀
2023-03-14
问题内容

我想知道是否可以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查询上使用,这将满足所有已指定的filterjoin条件。



 类似资料:
  • 问题内容: 如何使用Swift 进行倒数计时? 问题答案: 问题1: 问题2: 两者都可以。SpriteKit是用于场景,运动等的SDK。简单视图应用程序是项目模板。他们不应该冲突

  • 我有一个简单的国家/地区表,其中包含名称,大陆,人口和其他一些字段。 我正在尝试使用ActiveRecord执行以下MySQL查询 选择来自大陆=“亚洲”的国家/地区的计数(*),总和(人口),AVG(人口) 我该怎么做? 我试过: 国其中(:大陆= 国其中(:大陆= 国其中(:大陆= 它们都单独工作得很好,它们都返回数字(不是一个ActiveRelation对象),这意味着您不能做类似 国其中(

  • 对不起,朋友们,我想问一下。我有4个db表。 桌位 表type_member 表事务处理 表history_member 如上所示的表格内容示例。如果表格的内容像上面的照片。如何找出总交易类型_Member“银”是怎样的?因为,例如,如果我使用查询将loket表与事务连接起来,那么结果必须为空,因为在transaction表中假定没有事务来自成员类型为silver的loket。即使你看看历史,它应

  • 我有一个来自以下用户的消息列表: 我想从这个消息对象列表中计数并显示。有代码帮助吗?

  • 问题内容: 我阅读了Firestore文档以及Internet(stackoverflow)上有关Firestore分页的所有文章,但没有运气。我试图在文档中实现确切的代码,但是什么也没有发生。我有一个包含项目的基本数据库(超过1250个或更多),我想逐步获取它们。通过滚动以加载15个项目(到数据库中的最后一个项目)。 如果使用文档代码: 怎么做?文档没有太多细节。 PS:当用户滚动时,我需要使用

  • 我正在使用webpack,并根据示例分别基于whatwg-fetch和es6-promise包为较旧的浏览器提供了polyfill fetch和Promise。 但是,现在我需要polyfill array.prototype.find(),但是找不到如何使用WebPack的ProvidePleugin特性实现这一点。find的不同之处在于,它本质上是数组原型上的一个方法,我还没有找到如何使用Pr