Python中将元组列表数据插入DB2数据库报错的解决方法
问题原因
你的插入代码存在几个直接导致运行失败的问题:
ibm_db.execute()单次仅接受单条记录对应的元组作为入参,你把存储全量记录的列表new_records整体传入,还额外套了一层元组包装(records,),参数结构和占位符要求完全不匹配- 未实现批量遍历/批量执行逻辑,无法将列表中的多个元组逐行映射到表字段
- 额外注意:DB2默认不开启自动提交,执行完写操作如果不手动提交事务,数据不会实际落盘,连接断开后会自动回滚
修复代码
根据你的数据量选择对应实现即可:
小数据量场景(千条级以内)
遍历记录列表逐行执行预编译语句即可,逻辑简单易调试:
def insert_records(records): # 建议显式指定插入字段,避免表结构调整时字段顺序不匹配报错 Db2_Insert = "INSERT INTO SALES_DATA (rowid, product_id, customer_id, quantity) VALUES(?,?,?,?)" stmt = ibm_db.prepare(conn, Db2_Insert) for single_record in records: # 单条元组直接作为参数传入,不需要额外套层 ibm_db.execute(stmt, single_record) insert_records(new_records) # 必须手动提交事务 ibm_db.commit(conn) print("New rows inserted into production datawarehouse = ", len(new_records))
大数据量场景(万条级及以上)
使用ibm_db自带的批量执行接口,底层会做写入优化,性能远高于逐行循环插入:
def insert_records(records): Db2_Insert = "INSERT INTO SALES_DATA (rowid, product_id, customer_id, quantity) VALUES(?,?,?,?)" stmt = ibm_db.prepare(conn, Db2_Insert) # 直接传入全量元组列表完成批量写入 ibm_db.execute_many(stmt, records) insert_records(new_records) ibm_db.commit(conn) print("New rows inserted into production datawarehouse = ", len(new_records))
排错提示:如果运行仍报错,先打印
new_records里的单条元组长度、元素类型,确认和表字段的数量、类型完全匹配,比如不要把字符串类型的数值传到整型字段里。
内容的提问来源于stack exchange,提问作者Kairoush
相关产品推荐
相关产品推荐

