Как сохранить среднюю функцию в flask с помощью SQLAlchemy? - PullRequest
0 голосов
/ 18 июня 2020

Предположим, у меня есть таблица рейтингов, книг и пользователей, созданная следующим образом:

    CREATE TABLE books(
  id SERIAL PRIMARY KEY,
  ISBN VARCHAR NOT NULL,
  title VARCHAR NOT NULL,
  author VARCHAR NOT NULL,
  publicationYear INTEGER NOT NULL
);

    CREATE TABLE ratings(
  id SERIAL PRIMARY KEY,
  user_id INTEGER REFERENCES users(id),
  book_id INTEGER REFERENCES books(id),
  rating INTEGER CHECK (rating <= 5)
);

CREATE TABLE users(
  id SERIAL PRIMARY KEY,
  username VARCHAR UNIQUE,
  password VARCHAR NOT NULL,
);

Я попытался создать веб-сайт, на котором я могу оценивать конкретную книгу, который, в свою очередь, должен поддерживать свой средний рейтинг каждый раз. некоторые пользователи оценивают эту книгу. Моя попытка: в application.py по какому-то маршруту: ....

rating = db.execute("SELECT AVG(rating) FROM ratings WHERE book_id = :id", {"id": book_id}).fetchone()
    if rating is None:
        rating = 0
....
return render_template("details.html", rating = rating, book = book)

Внутренние детали. html:

(some html code)
Rating: {{ rating }} out of 5
(some other html code)

Все работает нормально (никаких ошибок), но есть две проблемы, которые я не смог решить:

1) Если оценки не выставлены, я ожидал, что на веб-сайте будет отображаться 0 (рейтинг), но вместо этого было показано «(Нет,)».

2) Если есть оценки, вместо отображения (например) 4,5 в качестве рейтинга (я хочу, чтобы ответ был округлен до 1 десятичного знака), отображается «(Десятичное ('4.5000000000000000'),)»

Как исправить эти проблемы и почему он извлекает что-то отличное от float (я предполагаю, потому что рейтинг имеет другой тип, кроме целого)?

Примечание: я не могу использовать такие вещи, как создание классов / objects или специальные свойства SQLAlchemy - только SQL запросов, подобных приведенным выше.

1 Ответ

0 голосов
/ 18 июня 2020

Есть несколько возможных исправлений ваших проблем, которые вы можете попробовать:

Я подозреваю, что sqlalchemy не возвращает никаких строк, если нет рейтинга, но это не «None», а скорее пустой массив [] или результат sql с количеством строк 0

попробуйте вместо этого эту проверку:

if not rating:
  rating = 0

или

for item in rating:
  if item is None:
     rating = 0

Python выполняет множество проверок на ложность (ноль , пустые массивы, None, et c ...), однако, если вы специально указываете «is None», вы проверяете только None. Распечатайте рейтинг после выполнения, чтобы проверить, что именно там происходит.

аналогично, если вы все же получили рейтинг, вы должны распечатать его и посмотреть, как выглядит число. Вероятно, это очень легко исправить, поэтому попробуйте round(number,1), который удаляет все десятичные знаки, кроме 1.

Убедитесь, что вы работаете с IDE, которая позволяет вам устанавливать точки останова и проверять код, пока это происходит. Распечатывать все в долгосрочной перспективе невозможно.

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