У меня есть приложение Flask, которое отображает некоторую простую статистику о количестве книг, введенных пользователем, и о том, сколько они пометили как прочитанные каждый месяц. При локальном тестировании запроса к базе данных SQLite3 все работает нормально. Однако при развертывании в Heroku, которая использует базу данных PostgreSQL, статистика выходит неверной. Запрос выглядит так:
books_group = db.session.query(extract("month", Book.timestamp), func.count(Book.id), func.count(Book.read)).filter(Book.user_id == current_user.id).group_by(extract("month", Book.timestamp)).all()
При локальном запуске вывод выглядит так: [(4, 27, 21)]
где первое число - это месяц, второе - количество введенных книг и третье - количество прочитанных книг. При работе на Heroku вывод: [(4.0, 10, 10)]
Независимо от того, что я делаю, количество введенных книг и количество книг, помеченных как прочитанные, всегда равны, хотя вывод должен быть [(4.0, 10, 5)]
Моя модель выглядит как:
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(140))
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
read = db.Column(db.Boolean, default=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
И данные выглядят так:
+----+--------+-----------------------+------+---------+
| id | title | timestamp | read | user_id |
+----+--------+-----------------------+------+---------+
| 1 | Foo | 17 apr. 2020 13:14:47 | 1 | 1 |
| 2 | Bar | 17 apr. 2020 13:14:47 | 1 | 1 |
| 3 | Baz | 18 apr. 2020 13:14:47 | 0 | 1 |
| 4 | Foobar | 18 apr. 2020 13:14:47 | 1 | 2 |
| 5 | BarBaz | 18 apr. 2020 13:14:47 | 0 | 2 |
| | FooBaz | 19 apr. 2020 13:14:47 | 0 | 1 |
+----+--------+-----------------------+------+---------+
Что здесь не так?
РЕДАКТИРОВАТЬ:
Решение, которое работало для SQLite3 и PostgreSQL было:
books_group = db.session.query(extract("month", Book.timestamp), func.count(Book.id), func.sum(cast(Book.read, Integer))).filter(Book.user_id == current_user.id).group_by(extract("month", Book.timestamp)).all()