sqlite3.OperationalError: near "VALUES"语法错误排查求助
解决sqlite3.OperationalError: near "VALUES": syntax error
你的问题根源非常明确——INSERT语句里错误地重复了VALUES关键字,这直接违反了SQL的语法规则。让我们一步步拆解问题并修复:
错误代码的核心问题
看你写的INSERT语句:
c.execute("INSERT INTO userInfo VALUES(username, password, authority, name, surname, idnum) " "VALUES(?, ?, ?, ?, ?, ?)", (username, password, authority, name, surname, idnum))
这里你犯了两个小错误:
- 重复写了两次
VALUES关键字,SQLite解析器无法识别这种语法; - 第一次
VALUES里直接写变量名的方式,在参数化查询中是无效的,应该统一用占位符?。
修正后的正确代码
推荐使用指定列名+参数化占位符的写法(更清晰,且后续表结构调整时不容易出错):
# 获取用户输入 username = input("Username: ") password = input("Password: ") authority = input("Authority level (1 or 2): ") name = input("Name : ") surname = input("Surname : ") idnum = input("Identity Number: ") # 确保你已初始化连接和游标(比如:conn = sqlite3.connect('users.db'), c = conn.cursor()) # 创建表(这部分逻辑没问题,保持即可) c.execute("""CREATE TABLE IF NOT EXISTS userInfo( username TEXT, password TEXT, authority TEXT, name TEXT, surname TEXT, idnum TEXT )""") # 修正后的INSERT语句:仅保留一次VALUES,用占位符绑定变量 c.execute("""INSERT INTO userInfo( username, password, authority, name, surname, idnum ) VALUES(?, ?, ?, ?, ?, ?)""", (username, password, authority, name, surname, idnum)) # 提交事务并关闭连接(务必添加,避免数据未写入数据库) conn.commit() conn.close()
如果想简化写法(不指定列名),也可以这样写,但要求传入值的顺序必须和表定义的列顺序完全一致:
c.execute("INSERT INTO userInfo VALUES(?, ?, ?, ?, ?, ?)", (username, password, authority, name, surname, idnum))
额外的优化建议
- 输入验证:针对
authority要求是1或2的规则,可添加简单校验避免无效数据:while authority not in ["1", "2"]: authority = input("Authority level must be 1 or 2, please re-enter: ") - 密码安全:永远不要明文存储密码!可以用
hashlib或bcrypt对密码哈希后再存入,示例:import hashlib password_hash = hashlib.sha256(password.encode()).hexdigest() # 后续存入password_hash而非原始密码
修改后运行代码,就能正常将数据写入users.db了。
内容的提问来源于stack exchange,提问作者Nhmanas
相关产品推荐
相关产品推荐

