如何解决sqlite3.ProgrammingError:需5个绑定参数但提供了8个
错误原因
executemany用于批量执行多条相同结构的SQL语句,要求传入的第二个参数是由多个参数元组组成的可迭代对象,比如[(参数组1), (参数组2)]这种格式。你现在只插入单条数据,直接传了单个参数元组dati,executemany会把你传的元组里的每个元素当成单独的参数组遍历,再把每个字符串元素拆成单个字符作为绑定参数,自然就出现参数数量不匹配的报错。- 你写的
'{pat}'没有加f前缀,不会实际替换为变量pat的值,只会把{pat}作为普通字符串存入数据库,达不到你要的取值效果。 - 不需要手动给SQL参数加引号,sqlite的参数绑定机制会自动处理数据类型,手动拼接反而有SQL注入的风险。
修复方案
单条插入直接用cursor.execute()方法,直接传变量作为参数即可,不需要手动做字符串格式化:
tableframe="CREATE TABLE IF NOT EXISTS frames(frame_id INTEGER PRIMARY KEY, nameframe_path TEXT, timestamp TEXT, accelerometro TEXT, giroscopio TEXT, magnetometro TEXT) " cursor.execute(tableframe) for ele in lol: for pat in paths: if re.search(ele[0],pat): # 直接传入变量,不需要手动格式化字符串 dati=(pat, ele[0], ele[1], ele[2], ele[3]) # 单条插入用execute即可 cursor.execute("INSERT INTO frames(nameframe_path, timestamp, accelerometro, giroscopio, magnetometro) VALUES (?,?,?,?,?)", dati)
如果你后续需要扩展为批量插入,坚持要用executemany,需要把单个参数元组套在外层可迭代对象里:
# 仅作批量插入语法示例,单条插入不推荐该写法 cursor.executemany("INSERT INTO frames(nameframe_path, timestamp, accelerometro, giroscopio, magnetometro) VALUES (?,?,?,?,?)", [dati])
内容的提问来源于stack exchange,提问作者Salvatore Pennisi
相关产品推荐
相关产品推荐

