Python CRUD操作SQLite3遇TypeError:update_profile缺失5个必传参数
问题分析与修复方案
1. 解决TypeError的直接原因
这个错误是调用update_profile方法时未传入name、age、gender、height、weight这5个必填参数。比如你调用时可能只写了obj.update_profile(),正确的调用方式需要传入对应的输入控件实例(比如GUI的输入框对象):
# 假设你的输入框是tkinter的Entry实例,调用时传入对应控件 obj.update_profile(name_entry, age_entry, gender_entry, height_entry, weight_entry)
2. 代码中的其他致命问题(必须修复才能正常运行)
2.1 SQL语句语法错误
- UPDATE语句:WHERE子句的条件需要用
AND连接,而非逗号;且更新记录应该用唯一标识(比如用户ID)定位,用所有字段当条件逻辑不合理,正确写法示例:UPDATE table_name SET name=?, age=?, gender=?, height=?, weight=? WHERE id=? - SELECT语句:完全不符合SQL语法,正确的查询需要指定表名,WHERE条件用
AND连接,示例:SELECT * FROM table_name WHERE id=?
2.2 变量定义顺序错误
你在执行c.execute时提前使用了new_name等变量,但这些变量是在执行语句之后才定义的,会触发NameError,必须先获取输入值,再执行SQL操作。
2.3 未定义old_name等变量
代码里用到的old_name、old_age等变量没有任何定义,会直接报错。如果要修改已有记录,建议用唯一ID定位,而非所有字段的旧值。
2.4 循环变量覆盖问题
for datas in datas:中循环变量和列表变量同名,会覆盖原列表,后续无法访问原始查询结果,应改为for data in datas:。
修复后的完整代码示例
def update_profile(self, name_entry, age_entry, gender_entry, height_entry, weight_entry, user_id): # 先获取输入框的新值 new_name = name_entry.get() new_age = age_entry.get() new_gender = gender_entry.get() new_height = height_entry.get() new_weight = weight_entry.get() conn = sqlite3.connect("users_db.db") c = conn.cursor() # 用user_id唯一定位要更新的记录 c.execute(""" UPDATE table_name SET name=?, age=?, gender=?, height=?, weight=? WHERE id=? """, (new_name, new_age, new_gender, new_height, new_weight, user_id)) # 查询更新后的记录 c.execute("SELECT * FROM table_name WHERE id=?", (user_id,)) datas = c.fetchall() for data in datas: print(data) conn.commit() conn.close()
调用示例
# 假设user_id是要修改的用户的唯一标识(比如从列表选中的用户ID) update_profile(name_entry, age_entry, gender_entry, height_entry, weight_entry, user_id=1)
内容的提问来源于stack exchange,提问作者WinkWest
相关产品推荐
相关产品推荐

