Python操作MySQL插入变量报错:参数需为列表、元组或字典
问题原因
你遇到的报错核心是误用了executemany()方法:
executemany()是用来批量插入多条记录的,它要求第二个参数是包含多个记录的可迭代对象(比如列表套元组)。但你现在只需要插入单条记录,却直接传了一个单条记录的元组,驱动会把元组里的每个元素当成独立记录解析,第一个元素int(10)不符合"列表/元组/字典"的要求,因此报错。
解决方案
方案1:改用execute()(推荐,适配单条插入场景)
把代码里的cursor.executemany()改成cursor.execute(),参数保持不变即可,因为execute()专门处理单条记录的插入,接受单个元组作为参数:
cursor.execute("insert into consumed(id, category, type, brand,\ seller, baseunit, baseqty, consumed, kcal, fat, sat_fat, \ carbs, sugar, free_sugar, fibre, protein, salt) \ values (%s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, \ %s, %s, %s)", (fieldvar0, fieldvar1, fieldvar2, fieldvar3, \ fieldvar4, fieldvar5, fieldvar6, user_percentage, \ fieldvar7, fieldvar8, fieldvar9, fieldvar10, \ fieldvar11, fieldvar12, fieldvar13, \ fieldvar14, fieldvar15))
注意:把str(user_percentage)改成user_percentage,如果consumed字段是数值类型,直接传整数更规范。
方案2:如果非要用executemany()
把单条记录的元组放进列表里,让它符合"多条记录集合"的参数要求:
cursor.executemany("insert into consumed(id, category, type, brand,\ seller, baseunit, baseqty, consumed, kcal, fat, sat_fat, \ carbs, sugar, free_sugar, fibre, protein, salt) \ values (%s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, \ %s, %s, %s)", [(fieldvar0, fieldvar1, fieldvar2, fieldvar3, \ fieldvar4, fieldvar5, fieldvar6, user_percentage, \ fieldvar7, fieldvar8, fieldvar9, fieldvar10, \ fieldvar11, fieldvar12, fieldvar13, \ fieldvar14, fieldvar15)])
代码优化建议(可选)
你把查询结果拆成16个fieldvar变量的写法太繁琐,可以直接用原查询结果构造插入参数,简化代码:
sql_select_query = """select id, category, type, \ brand, seller, baseunit, baseqty, kcal, fat, sat_fat, \ carbs, sugar, free_sugar, fibre, protein, salt \ from foods where id = %s""" cursor.execute(sql_select_query, (id,)) data = cursor.fetchone() if not data: print("未找到对应ID的食物数据") exit() user_percentage = int(input("Percentage of base quantity consumed? ")) # 构造插入参数:原数据前7项 + 食用百分比 + 原数据从第8项开始的营养值 insert_params = list(data[:7]) + [user_percentage] + list(data[7:]) # 调整kcal数值(对应insert_params的第8位) insert_params[8] = insert_params[8] * user_percentage / 100 # 执行插入 cursor.execute("insert into consumed(id, category, type, brand,\ seller, baseunit, baseqty, consumed, kcal, fat, sat_fat, \ carbs, sugar, free_sugar, fibre, protein, salt) \ values (%s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, \ %s, %s, %s)", tuple(insert_params)) connection.commit()
内容的提问来源于stack exchange,提问作者zimbean
相关产品推荐
相关产品推荐

