使用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()
关键修改说明
- 参数化查询:所有SQL操作都使用
?作为占位符,参数放在元组中传给execute方法,这是Python操作SQLite的标准方式,彻底解决语法错误和SQL注入风险。 - 变量格式修正:
name直接用字符串类型,new_number转为整数,匹配数据库字段类型。 - 事务提交修复:补上
conn.commit()的括号,确保修改生效。 - 异常处理:插入数据时捕获
IntegrityError,避免因主键重复导致程序崩溃。
内容的提问来源于stack exchange,提问作者HurricaneShard
相关产品推荐
相关产品推荐

