如何用sqlalchemy维护flask中的平均函数?

yks3o0rb  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(289)

假设我创建了一个表ratings,books and users,如下所示:

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)

inside details.html:

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

一切正常(没有任何错误),但有两个问题我无法解决:
1) 如果没有评分,我希望网站显示0(评分),但它显示“(无,)”而不是。
2) 如果有评分,则不显示(例如)4.5作为评分(我希望答案四舍五入到小数点后1位),而是显示“(decimal('4.5000000000000000'),)”
如何解决这些问题以及为什么它检索除float以外的其他类型(我假设rating具有除integer以外的其他类型)?
备注:我不能使用像创建类/对象或特殊的sqlalchemy属性这样的任何东西-只有像上面那样的sql查询。

5m1hhzi4

5m1hhzi41#

对于您的问题,您可以尝试以下几种可能的解决方法:
我怀疑sqlalchemy在没有评级的情况下不会返回任何行,但它不是“none”,而是一个空数组[],或者一个rowcount为0的sql结果
请改为尝试此检查:

if not rating:
  rating = 0

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

python对falsy做了很多检查(零、空数组、none等等),但是如果你特别说“is none”,你只会检查完全没有。在执行后打印评级,查看那里到底发生了什么。
同样,如果你得到了一个评分,你应该把它打印出来,看看数字是什么样子。它可能很容易修复,所以试试看 round(number,1) ,删除除1以外的所有小数。
确保您使用的ide允许您在代码发生时设置断点和检查代码。从长远来看,把一切都打印出来是不可行的。

相关问题