Python SQLite使用executemany()插入计算值时遇参数类型不支持错误
解决SQLite executemany()的"parameters are of unsupported type"错误
你遇到的问题出在executemany()的参数传递逻辑上,咱们一步步理清楚:
错误根源
在循环里你已经定义了item = [(var1),],这本身是符合executemany()要求的序列的序列(一个包含单个元组的列表)。但调用时你额外给它套了一层括号:(item),这会把原本的列表变成元组里的单个元素,也就是([(var1),],)——这种嵌套结构让SQLite无法正确解析参数类型,自然就抛出了类型不支持的错误。
另外补充个小知识点:这里你每次循环只插入一条记录,其实用execute()会更贴合场景,executemany()本来是为批量插入多条数据设计的。
解决方案1:改用execute()(推荐)
把循环部分的代码改成这样,直接传递单个元组作为参数:
for row in c.execute(sql): var1 = row[1]*2 # 用execute处理单条插入,参数传(var1,)这个元组 c.execute('INSERT INTO nutrition_consumed VALUES (?)', (var1,))
解决方案2:如果坚持用executemany()
保持item的定义,直接把它传给executemany(),去掉多余的括号包裹:
for row in c.execute(sql): var1 = row[1]*2 item = [(var1),] # 直接传入item这个符合要求的列表 c.executemany('INSERT INTO nutrition_consumed VALUES (?)', item)
额外优化建议
- 给
nutrition_consumed表的字段指定数据类型会更规范,毕竟你存的是计算后的浮点数:
c.execute('''CREATE TABLE IF NOT EXISTS nutrition_consumed (var1 REAL)''')
- 可以用SQL语句直接完成计算+插入,省去Python循环,效率更高:
INSERT INTO nutrition_consumed (var1) SELECT nv.calories * 2 FROM nutritional_values nv INNER JOIN food_consumption fc ON nv.item = fc.item
直接执行这条SQL,就能替代原来的循环插入逻辑。
内容的提问来源于stack exchange,提问作者Runner Bean
相关产品推荐
相关产品推荐

