SQLite中UserData表f_name字段更新无报错但未生效问题求助
问题原因
- 核心是
save_fName函数里的SQL拼接逻辑错误,导致WHERE条件无法匹配到对应数据行,更新操作实际影响行数为0,因此不会触发报错也不会修改字段值:- 你的
user_id字段是int类型,但是拼接SQL时给它包裹了多余的单引号和加号,最终生成的WHERE条件是WHERE user_id = '''+{userid}+''',相当于用字符串和int类型的user_id做匹配,完全匹配不到任何行 - 字段赋值部分同样拼接错误,即使匹配到行,写入的
f_name值也会包含多余的单引号和加号,不是你传入的sf_N原值
- 你的
- 你更新
phone_no时逻辑正常,是因为你写对应更新语句时没有出现上述的拼接错误,WHERE条件可以正常匹配到行
解决方法
1. 替换SQL拼接为参数化查询(推荐,同时解决语法问题和SQL注入风险)
不要用f字符串直接拼接SQL内容,改用数据库驱动支持的参数占位符写法,示例如下(MySQL用%s作为占位符,SQLite用?,可根据你使用的数据库类型调整):
def save_fName(sf_N, userid): c.execute("UPDATE UserData SET f_name = %s WHERE user_id = %s", (sf_N, userid)) conn.commit()
如果需要验证更新是否生效,可以获取execute返回的影响行数做判断:
def save_fName(sf_N, userid): affected_rows = c.execute("UPDATE UserData SET f_name = %s WHERE user_id = %s", (sf_N, userid)) conn.commit() if affected_rows == 0: print(f"未找到user_id为{userid}的用户,更新失败")
2. (可选)修正建表语句的主键设置
你当前的建表语句中id字段设了AUTO_INCREMENT但未设为主键,属于不规范写法,建议修正:
c.execute("""CREATE TABLE UserData ( id int AUTO_INCREMENT PRIMARY KEY, user_id int, f_name text, phone_no text, f_code int, Recording_url text, rrt_number int, c_cex int, c_y int, nt_number int, x_pin int )""")
内容的提问来源于stack exchange,提问作者middlepost
相关产品推荐
相关产品推荐

