Как мне вернуть количество всех строк в таблице, а затем счетчик каждый раз, когда определенный статус найден? - PullRequest
0 голосов
/ 09 мая 2019

Пожалуйста, прости мое невежество по 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()

Отсюда я конвертирую его в dict и объединяю, чтобы вывод выглядел так:

{
  "data": {
    "status_count": {
        "Assigned": 1,
        "In Progress": 1,
        "Peer Review": 1,
        "Ready to Publish": 1,
        "Unassigned": 4
    },
    "total_requests": 8
  }
* *} Тысяча двадцать-один

Любая помощь очень ценится.

1 Ответ

1 голос
/ 09 мая 2019

Я не знаю о sqlalchemy, но можно сгенерировать нужные результаты в одном запросе с использованием чистого sqlite, используя расширение JSON1 :

С учетом следующей таблицы и данных:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...