SQLite3传入两个参数时无法更新REGISTER表值的技术问题
解决SQLite3中UPDATE语句无法更新表的问题
嘿,我来帮你搞定这个SQLite3的更新问题!你的代码方向是对的,但有几个常见的坑可能导致更新没生效,咱们一步步来排查:
1. 最常见的原因:忘记提交事务
SQLite3在Python中默认会开启事务,所有增删改操作都需要手动提交才能真正写入数据库。你现在的代码只执行了execute,但没提交,修改只是停留在内存里,关闭连接后就会丢失。
修复代码:
import sqlite3 # 初始化数据库连接和游标 conn = sqlite3.connect('your_database.db') cur = conn.cursor() # 执行更新语句 cur.execute("UPDATE REGISTER SET PASSWORD = ? WHERE USERID = ?", (new_pswd, fg_uid)) # 关键步骤:提交事务 conn.commit() # 用rowcount检查实际更新的行数,方便排查问题 print(f"成功更新 {cur.rowcount} 行数据") # 用完记得关闭资源 cur.close() conn.close()
2. 别在UPDATE语句后用fetchall()
fetchall()是用来获取SELECT查询的结果集的,UPDATE属于修改操作,不会返回数据,这行代码完全没用,甚至会让你误以为操作出了问题。换成cur.rowcount可以查看实际被更新的行数,如果返回0,说明WHERE条件没匹配到任何行。
3. 检查WHERE条件的参数匹配
如果cur.rowcount返回0,大概率是你的fg_uid和数据库里的USERID不匹配:
- 核对数据类型:比如数据库里USERID是整数,但你传入的
fg_uid是字符串,或者反过来。可以尝试转换类型,比如int(fg_uid)(如果USERID是整数类型)。 - 手动验证值是否存在:直接在数据库里执行
SELECT * FROM REGISTER WHERE USERID = '你的fg_uid值',看看有没有匹配的结果。
4. 表名/字段名的大小写问题
SQLite在不同系统下对大小写的处理有差异:
- Windows系统默认不区分大小写,但Linux/macOS是严格区分的。如果你的实际表名是
register(小写),但代码里写了REGISTER,在Linux下就会找不到表。 - 同时检查PASSWORD、USERID字段名是否和数据库里的一致,有没有拼写错误。
5. 确认连接和游标是正确的
确保你的游标cur是从当前的数据库连接conn创建的,不要混用不同的连接对象,否则修改会在另一个连接的事务里,根本不会作用到目标数据库。
按照上面的步骤排查,应该就能解决你的更新问题了!
内容的提问来源于stack exchange,提问作者Rajesh Prasad
相关产品推荐
相关产品推荐

