如何返回表中所有行的计数,然后每次找到特定状态时返回计数?

时间:2019-05-09 19:57:45

标签: sqlite sqlalchemy

请原谅我对sqlalchemy的无知,直到现在我已经能够在海洋中航行了。我想要做的是这样:

  • 返回表中有多少项的计数。
  • 返回表中出现的许多不同状态的次数。

我目前正在使用sqlalchemy,但即使是纯sqlite解决方案也有助于弄清我所缺少的内容。

这是我的表格的配置方式:

class KbStatus(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    status = db.Column(db.String, nullable=False)

这是一个非常基本的表,但是我很难找回想要的数据。我有2个独立的查询,但我必须相信有一种方法可以在一个查询中完成所有操作。

以下是我正在运行的单独查询:

total = len(cls.query.all())
status_count = cls.query.with_entities(KbStatus.status, func.count(KbStatus.id).label("total")).group_by(KbStatus.status).all()

在这里,我将其转换为字典并将其组合以使输出看起来像这样:

{
  "data": {
    "status_count": {
        "Assigned": 1,
        "In Progress": 1,
        "Peer Review": 1,
        "Ready to Publish": 1,
        "Unassigned": 4
    },
    "total_requests": 8
  }

}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我不了解sqlalchemy,但是可以使用JSON1扩展名在纯sqlite的单个查询中生成所需的结果:

给出下表和数据:

CREATE TABLE data(id INTEGER PRIMARY KEY, status TEXT);
INSERT INTO data(status) VALUES ('Assigned'),('In Progress'),('Peer Review'),('Ready to Publish')
                               ,('Unassigned'),('Unassigned'),('Unassigned'),('Unassigned');
CREATE INDEX data_idx_status ON data(status);

此查询

WITH individuals AS (SELECT status, count(status) AS total FROM data GROUP BY status)
SELECT json_object('data'
                 , json_object('status_count'
                              , json_group_object(status, total)
                              , 'total_requests'
                              , (SELECT sum(total) FROM individuals)))
FROM individuals;

将返回保留的一行(通过JSON漂亮打印机运行后;实际的字符串更紧凑):

{
  "data": {
    "status_count": {
      "Assigned": 1,
      "In Progress": 1,
      "Peer Review": 1,
      "Ready to Publish": 1,
      "Unassigned": 4
    },
    "total_requests": 8
  }
}

如果您使用的sqlite实例不是由对JSON1的支持构建的:

SELECT status, count(status) AS total FROM data GROUP BY status;

会给予

status                total
--------------------  ----------
Assigned              1
In Progress           1
Peer Review           1
Ready to Publish      1
Unassigned            4

,您可以在python中进行迭代,将每一行插入到dict中,并在最后获得total值时将所有total_requests值加到另一个变量中。无需其他查询即可计算该数字;手动进行。我敢打赌,使用现有的第二个sqlachemy查询执行相同的操作真的很容易。