You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:04:56