使用cx_Oracle Cursor.executemany()遇TypeError:期望输入数字
问题:executemany批量插入抛出TypeError(期望输入数字)
使用Cursor.executemany批量插入数据时触发TypeError,提示“期望输入数字”,即使添加batcherrors=True参数仍无法绕过该错误。但改用循环调用cursor.execute单条插入时,所有数据都能成功写入数据库。
报错代码示例
sql_statement = "insert into table (x, y, z) values (:x, :y, :z)" cursor.prepare(sql_statement) cursor.executemany(None, rows_to_be_inserted, batcherrors=True) for error in Cursor.getbatcherrors(): print(error.message)
注:executemany调用直接报错,后续错误遍历循环从未执行。
正常运行代码示例
sql_statement = "insert into table (x, y, z) values (:x, :y, :z)" for row in rows_to_be_inserted: cursor.execute(sql_statement, row)
排查与解决方法
1. 检查数据结构是否符合要求
executemany要求传入的参数是序列的序列或序列的字典(对应命名参数场景)。如果你的rows_to_be_inserted不是列表套字典的结构,比如单个字典、或者元素格式不统一,就会触发类型错误。
正确的结构示例:
rows_to_be_inserted = [ {"x": 101, "y": 202, "z": 303}, {"x": 404, "y": 505, "z": 606}, # 确保每一行都是键名匹配参数的字典 ]
2. 验证字段数据类型
executemany对数据类型的检查比单条execute更严格。如果数据库中x/y/z是数字类型字段,但你传入的是字符串形式的数字(比如"123"而非123),单条插入时驱动可能自动转换,但批量插入时会直接抛出TypeError。
逐个检查rows_to_be_inserted中的元素,确保数字字段对应的值是int或float类型:
# 示例:转换字符串数字为int/float for row in rows_to_be_inserted: row["x"] = int(row["x"]) row["y"] = float(row["y"])
3. 检查数据库驱动版本
如果使用的是cx_Oracle这类驱动,旧版本对命名参数的批量插入支持存在bug。尝试升级到最新稳定版:
pip install --upgrade cx_Oracle
4. 调整executemany调用方式
部分场景下,提前prepare语句可能引发兼容性问题,可直接传入SQL语句调用executemany:
sql_statement = "insert into table (x, y, z) values (:x, :y, :z)" cursor.executemany(sql_statement, rows_to_be_inserted, batcherrors=True)
内容的提问来源于stack exchange,提问作者Ahmed Malabi
相关产品推荐
相关产品推荐

