我正在创建一个在线教程的书评网站。似乎我正在将一些倾斜的值user_id传递到reviews表中。
user_id应该是一个纯整数(Smallint),但是在错误消息中,它显示为(2,),我想知道这是否是这个错误的主要原因。
在这条路线上,我要做的是显示一本书的详细页面,并让用户提交一份评论。因此,我从存储的会话中获取username,并使用它从users表中提取user_id,并将其作为外键值user_id插入review表中。
,这是我的路线,与问题有关。
@app.route('/book/<string:isbn>', methods = ['POST','GET'])
def book(isbn):
#import columns from database
res = db.execute("SELECT * FROM books WHERE isbn = :isbn", {"isbn": isbn}).fetchone()
#import api from Goodreads (stats)
r = requests.get("https://www.goodreads.com/book/review_counts.json", params={"key": "L3FHyOR3IhCo3kctcUz3zg", "isbns": isbn})
if r.status_code != 200:
raise ValueError
reviews_count=r.json()["books"][0]["reviews_count"]
average_rating=r.json()["books"][0]["average_rating"]
username = session.get("username")
if request.method == "POST":
review = request.form.get("comment")
rating = request.form.get("rating")
date = datetime.now()
user_id = db.execute("SELECT id FROM users WHERE username = :username",{"username":username}).fetchone()
db.execute("INSERT INTO reviews (user_id, review, rating, date) VALUES (:user_id, :review, :rating, :date)", {"date":date, "review":review, "rating":rating, "user_id":user_id})
db.commit()
return render_template("book.html", reviews_count = reviews_count, average_rating = average_rating, email = username),这是错误消息!

请看代码,请让我知道你认为问题在哪里发生。耽误您时间,实在对不起!
发布于 2019-08-01 19:00:31
execute()总是为每一行返回一个列值的元组,即使您只选择一个列。更准确地说,它实际上是一个元组的包装器,称为RowProxy (或返回多行时的ResultProxy ),它为您提供了更多的功能。我会稍微修改变量名,以强调:
result = db.execute("SELECT id FROM users WHERE username = :username",{"username":username}).fetchone()
result.columns() # returns ('id',) - so you can create a dict of key value pairs
user_id = result[0]虽然你也可以保持简洁(注意逗号)
user_id, = db.execute("SELECT id FROM users WHERE username = :username",{"username":username}).fetchone()或
user_id = db.execute("SELECT id FROM users WHERE username = :username",{"username":username}).fetchone()[0]更新
我认为获得多列的最干净的方法是执行我在内联注释中所写的操作,即创建一个键值对的块。
result = db.execute("SELECT * FROM books WHERE isbn = :isbn", {"isbn": isbn}).fetchone()
# zip takes two lists and returns them as a list of tuples, combining
# the nth element of the first list and the nth element of the second list,
# so essentially it creates a list of key value pairs for you
book = {column: value for (column, value) in zip(result.columns(), result)}
book_id = book['id']或者在多行的情况下:
result = db.execute("SELECT * FROM books WHERE author_id = :author_id", {"author_id": author_id}).fetchall()
books = [
{column: value for (column, value) in zip(result.columns(), row)}
for row in result
]
book_ids = [book['id'] for book in books]https://stackoverflow.com/questions/57313491
复制相似问题