You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:25:14