假设我创建了一个表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查询。
1条答案
按热度按时间5m1hhzi41#
对于您的问题,您可以尝试以下几种可能的解决方法:
我怀疑sqlalchemy在没有评级的情况下不会返回任何行,但它不是“none”,而是一个空数组[],或者一个rowcount为0的sql结果
请改为尝试此检查:
或
python对falsy做了很多检查(零、空数组、none等等),但是如果你特别说“is none”,你只会检查完全没有。在执行后打印评级,查看那里到底发生了什么。
同样,如果你得到了一个评分,你应该把它打印出来,看看数字是什么样子。它可能很容易修复,所以试试看
round(number,1)
,删除除1以外的所有小数。确保您使用的ide允许您在代码发生时设置断点和检查代码。从长远来看,把一切都打印出来是不可行的。