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

SQLite中UserData表f_name字段更新无报错但未生效问题求助

问题原因
  • 核心是save_fName函数里的SQL拼接逻辑错误,导致WHERE条件无法匹配到对应数据行,更新操作实际影响行数为0,因此不会触发报错也不会修改字段值:
    1. 你的user_id字段是int类型,但是拼接SQL时给它包裹了多余的单引号和加号,最终生成的WHERE条件是WHERE user_id = '''+{userid}+''',相当于用字符串和int类型的user_id做匹配,完全匹配不到任何行
    2. 字段赋值部分同样拼接错误,即使匹配到行,写入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:24:01