Python脚本多列INSERT语句报错,单列正常(AWS S3数据库)
我来帮你排查这个问题——你的多列插入报错完全是因为executemany的参数传递方式错了,咱们一步步理清楚:
问题根源
你调用executemany时的参数格式不符合它的要求:
executemany的第二个参数需要是一个可迭代对象(比如列表),其中每个元素是对应一行数据的元组,元组里的元素数量要和SQL语句中?的数量严格匹配。- 你的错误写法是
cursor.executemany(sql, (x,),(y,))——这里你把两个独立的元组(x,)和(y,)作为两个参数传给了executemany,但它只接受第二个参数是包含行数据的可迭代对象,自然会触发报错。
而单列插入能运行其实是“碰巧”:你传的(x,)是一个单元素元组,executemany会把它当成一个包含一行数据的可迭代对象(每个元素是一行的参数),刚好匹配单列的?,所以没报错,但这其实不是executemany的正确用法(正确应该传[(x,)])。
两种解决方法
方法1:用execute逐行插入(适合循环场景)
既然你是在循环里逐个处理x和y,直接用execute更直观,参数传一个包含两个值的元组即可:
A = [] for score_row in score: # 记得把注释去掉,不然A只会收集到单个元素 A.append(score_row[2]) print("A=",A) B = [] for day_row in score: # 同样去掉注释,确保收集全量数据 B.append(day_row[1]) print("B=",B) for x,y in zip(A,B): sql = """INSERT INTO calculated_corr_coeff(date,Day) VALUES (?,?)""" cursor.execute(sql, (x, y)) # 用execute,参数是包含两个值的元组
方法2:用executemany批量插入(更高效)
如果要批量插入所有行,不需要循环调用executemany,直接把A和B打包成元组列表一次性传入,性能会更好:
A = [] for score_row in score: A.append(score_row[2]) B = [] for day_row in score: B.append(day_row[1]) # 把A和B打包成[(x1,y1), (x2,y2), ...]的结构 insert_data = list(zip(A, B)) sql = """INSERT INTO calculated_corr_coeff(date,Day) VALUES (?,?)""" cursor.executemany(sql, insert_data) # 一次性传入所有行数据
额外提醒
原代码里你把for循环注释掉了,这样A和B只会添加单个元素,大概率不是你想要的效果,记得把注释去掉,确保能收集到所有需要插入的数据。
内容的提问来源于stack exchange,提问作者Suraj Nimse
相关产品推荐
相关产品推荐

