Запрос SQLAlchemy дает противоречивые результаты в зависимости от типа базы данных - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть приложение 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...