请原谅我对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
}
}
任何帮助将不胜感激。
答案 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查询执行相同的操作真的很容易。