假设我创建了一个表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)
内部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有整数以外的其他类型)?
备注:我不能使用任何类似于创建类/对象或特殊SQLAlchemy属性的东西--只能使用类似于上面的SQL查询。
对于您的问题,您可以尝试一些可能的修复方法:
我怀疑如果没有评级,sqlalchemy不会返回任何行,但它不是“无”,而是空数组[],或者行计数为0的sql结果
请尝试此检查:
if not rating:
rating = 0
或
for item in rating:
if item is None:
rating = 0
Python会对falsy进行大量检查(零,空数组,无等),但是如果您特别说“是无”,那么您只会检查完全为无。 在执行后打印评级,以检查那里到底发生了什么。
同样,如果你确实得到了一个评级,你应该把它打印出来,看看这个数字是什么样子的。 它可能很容易修复,所以尝试round(number,1)
,它删除除1以外的所有小数。
确保您使用的IDE允许您设置断点并在发生断点时检查代码。 从长远来看,把所有的东西都打印出来是不可行的。