使用appJar创建图书评分按钮时遭遇sqlite3错误的问题咨询
图书馆GUI点赞功能错误排查与修复
核心问题分析
你的代码触发sqlite3.OperationalError: incomplete input错误,且按钮无法正常生成,根源在于以下几个问题:
- 按钮绑定逻辑错误:
app.addButton("Upvote", upvote(bookId))会直接执行upvote(bookId),而非点击按钮时触发。此时bookId是空字符串(刚创建输入框就调用getEntry,用户还未输入内容),导致SQL语句变为SELECT review from books WHERE id=,语法不完整。 - SQL语句问题:
- 用f-string拼接SQL存在注入风险,且字符串类型的ID未加引号,引发语法错误。
downvote函数中UPDATE的字段写错:应为review而非rating。
- 输入获取时机错误:创建子窗口时就获取
Book ID,此时用户还未输入,拿到的是空值。
修复后的代码
def upvote(): # 点击按钮时才获取用户输入的图书ID bookId = app.getEntry("Book ID") if not bookId: app.errorBox("错误", "请输入图书ID") return # 使用参数化查询避免SQL注入和语法错误 cur.execute("SELECT review from books WHERE id=?", (bookId,)) rating = cur.fetchone() if not rating: app.errorBox("错误", "未找到该图书") return newRating = rating[0] + 1 cur.execute("UPDATE books SET review=? WHERE id=?", (newRating, bookId)) con.commit() app.infoBox("成功", "点赞完成") def downvote(): bookId = app.getEntry("Book ID") if not bookId: app.errorBox("错误", "请输入图书ID") return cur.execute("SELECT review from books WHERE id=?", (bookId,)) rating = cur.fetchone() if not rating: app.errorBox("错误", "未找到该图书") return newRating = rating[0] - 1 # 修正字段名:review而非rating cur.execute("UPDATE books SET review=? WHERE id=?", (newRating, bookId)) con.commit() app.infoBox("成功", "点踩完成") def giveRating(): app.startSubWindow("Give Rating", modal=True) app.setFont(18) app.setBg("orange") app.setSize(400, 400) app.addLabelEntry("Book ID") # 按钮绑定函数引用,而非直接调用函数 app.addButton("Upvote", upvote) app.addButton("Downvote", downvote) app.showSubWindow("Give Rating") # 用showSubWindow正确显示子窗口 app.stopSubWindow()
关键修改说明
- 按钮绑定:
app.addButton("Upvote", upvote)直接传递函数引用,确保点击按钮时才执行函数。 - 输入获取:在
upvote/downvote函数内调用getEntry,保证获取到用户实际输入的内容。 - 参数化SQL:用
?作为占位符,既避免SQL注入,又自动处理字符串引号问题。 - 错误处理:增加空输入、图书不存在的判断,提升交互体验。
- 子窗口显示:用
showSubWindow替代app.show(),确保子窗口正常弹出。
内容的提问来源于stack exchange,提问作者x1n0_
相关产品推荐
相关产品推荐

