如何将CSV数据导入SQL新表?解决ValueError报错问题
问题排查与解决
问题描述
有一个17列的CSV文件,已通过pandas转换为DataFrame,成功创建SQL的Pedido表后,使用itertuples()循环插入数据时触发错误:ValueError: too many values to unpack (expected 2)
错误原因
- 循环解包错误:
df.itertuples()默认返回包含行索引的命名元组,结构为(索引值, 列1值, 列2值, ...)。代码中用for index, row in df.itertuples()尝试将该元组拆分为两个变量,但元组元素数量远大于2,导致解包失败。 - 参数传递错误:
cursor.execute()要求参数以元组/列表形式传入,代码中单独传递每个参数,即使解包正确也会触发参数数量不匹配的错误。
解决方法
方法1:修正循环与参数传递方式
保留itertuples()的默认行为,去掉多余的解包变量,并将参数打包为元组:
for row in df.itertuples(): cursor.execute(''' INSERT INTO Pedido (no_orden, codigo_producto, cantidad_orden, precio_cada, nombre_producto, linea_productos, descr, precio_compra, fecha_orden, no_cliente) VALUES (?,?,?,?,?,?,?,?,?,?) ''', (row.no_orden, row.codigo_producto, row.cantidad_orden, row.precio_cada, row.nombre_producto, row.linea_productos, row.descr, row.precio_compra, row.fecha_orden, row.no_cliente) ) conn.commit()
方法2:移除索引后直接传元组
使用itertuples(index=False)让返回的元组不包含索引,直接将元组作为参数传入:
for row in df.itertuples(index=False): cursor.execute(''' INSERT INTO Pedido (no_orden, codigo_producto, cantidad_orden, precio_cada, nombre_producto, linea_productos, descr, precio_compra, fecha_orden, no_cliente) VALUES (?,?,?,?,?,?,?,?,?,?) ''', row ) conn.commit()
方法3:批量插入(推荐)
避免循环插入的低效问题,使用pandas内置的to_sql()方法批量写入数据:
from sqlalchemy import create_engine # 根据你的数据库类型修改连接字符串,示例为SQLite engine = create_engine('sqlite:///你的数据库文件.db') # 筛选需要插入的列(与Pedido表列对应),批量写入 target_columns = ['no_orden', 'codigo_producto', 'cantidad_orden', 'precio_cada', 'nombre_producto', 'linea_productos', 'descr', 'precio_compra', 'fecha_orden', 'no_cliente'] df[target_columns].to_sql('Pedido', engine, if_exists='append', index=False)
内容的提问来源于stack exchange,提问作者David Vazquez
相关产品推荐
相关产品推荐

