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

使用F字符串执行SQLite UPDATE查询时遭遇语法错误的求助

问题分析与修复方案

你的代码出现语法错误的核心原因是用F字符串拼接SQL参数时,变量格式处理错误,同时还存在其他几处细节问题,以下是具体问题和修复方法:

主要错误点

  • name变量格式错误:你把name定义成了列表[input(...)],用F字符串拼接后,SQL语句会变成WHERE firstName = '['Ollie']',这种带方括号的字符串不符合SQL语法,直接触发语法错误。
  • new_number的元组创建错误:tuple[(int(input(...)))]是语法错误,tuple是内置函数,应该用tuple([...])或者(int(input(...)),)创建单元素元组;另外schoolNum是INTEGER类型,不需要用引号包裹值。
  • commit方法未调用:conn.commit缺少括号,不会执行事务提交操作。
  • F字符串拼接SQL存在风险:这种方式不仅容易出语法错误,还会导致SQL注入漏洞,是不推荐的写法。

修复后的完整代码

import sqlite3

# 直接获取名字字符串,无需包裹为列表
name = input('enter your firstname: ')

conn = sqlite3.connect('revision.db')
c = conn.cursor()

# 创建表逻辑保持不变
c.execute('''CREATE TABLE IF NOT EXISTS bartonHill (
    firstName TEXT NOT NULL,
    lastName TEXT NOT NULL,
    schoolNum INTEGER NOT NULL PRIMARY KEY
)''')
conn.commit()

# 插入数据使用参数化查询,避免硬编码,同时处理主键重复的异常
try:
    c.execute("INSERT INTO bartonHill VALUES (?, ?, ?)", ('Ollie','Burgess',20314))
    conn.commit()
except sqlite3.IntegrityError:
    # 学号是主键,重复插入会报错,这里直接跳过
    pass

# 获取新学号并转为整数类型
new_number = int(input('enter your new school number: '))

# 使用参数化查询执行UPDATE,完全避免字符串拼接的问题
c.execute("UPDATE bartonHill SET schoolNum = ? WHERE firstName = ?", (new_number, name))
conn.commit()  # 调用commit方法提交事务

# 查询同样使用参数化查询,参数用元组传入
c.execute('SELECT lastName, schoolNum FROM bartonHill WHERE firstName = ?', (name,))
print(c.fetchall())

# 最后记得关闭数据库连接
conn.close()

关键修改说明

  1. 参数化查询:所有SQL操作都使用?作为占位符,参数放在元组中传给execute方法,这是Python操作SQLite的标准方式,彻底解决语法错误和SQL注入风险。
  2. 变量格式修正:name直接用字符串类型,new_number转为整数,匹配数据库字段类型。
  3. 事务提交修复:补上conn.commit()的括号,确保修改生效。
  4. 异常处理:插入数据时捕获IntegrityError,避免因主键重复导致程序崩溃。

内容的提问来源于stack exchange,提问作者HurricaneShard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:18:29