提问者:小点点

如何用SQLAlchemy保持烧瓶中的平均功能?


假设我创建了一个表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查询。


共1个答案

匿名用户

对于您的问题,您可以尝试一些可能的修复方法:

我怀疑如果没有评级,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允许您设置断点并在发生断点时检查代码。 从长远来看,把所有的东西都打印出来是不可行的。