Python3连接Oracle数据库进行批量插入数据时报错如何解决?
如题:
报了这个错误:TypeError: expecting integer
但是单条插入没问题
Python3连接Oracle数据库进行批量插入数据时报错如何解决?
遇到批量插入报错,先看具体错误信息。最常见的是cx_Oracle.DatabaseError: DPI-1043: invalid number这类,通常是数据类型不匹配。
给你个完整示例,重点在cursor.executemany()的正确用法:
import cx_Oracle
import pandas as pd
# 1. 连接数据库
dsn = cx_Oracle.makedsn('host', 'port', service_name='service_name')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn)
cursor = conn.cursor()
# 2. 准备数据 - 确保数据类型匹配
data = [
(1, 'John', 25.5), # 注意数字类型
(2, 'Jane', 30.0),
(3, 'Bob', '35.5') # 字符串会被Oracle隐式转换,但可能报错
]
# 3. 正确的批量插入
sql = "INSERT INTO your_table (id, name, value) VALUES (:1, :2, :3)"
try:
cursor.executemany(sql, data)
conn.commit()
print(f"插入了 {cursor.rowcount} 行数据")
except cx_Oracle.DatabaseError as e:
error, = e.args
print(f"Oracle错误: {error.code} - {error.message}")
conn.rollback()
finally:
cursor.close()
conn.close()
关键点:
- 数据类型一致:确保Python数据与Oracle表字段类型匹配,特别是数字和日期
- 绑定变量:使用
:1, :2, :3占位符而不是字符串格式化 - 异常处理:捕获
cx_Oracle.DatabaseError查看具体错误 - 提交回滚:成功时commit,失败时rollback
如果还报错,在executemany()前加这行调试:
cursor.execute("ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '. '")
先检查数据类型是否匹配。
附上代码:
def insertOracleTable(self,table_name,datas=[]):
self.conndb()
#insert_sql=“insert into “+table_name+” values(:1,:2,:3,:4,:5,:6,:7)”
print(insert_sql)
print(datas)
self.cursor.prepare(insert_sql)
self.cursor.executemany(None,datas)
self.commitdb()
self.closedb()
附上数据:
[(‘数仓 1 节点’, ‘DW_TBL’, 1214, 1136.97, 77.03, 93.65, datetime.datetime(2018, 5, 31, 10, 26, 42)), (‘数仓 2 节点’, ‘TBS_DW_ODS_DAT’, 154, 139.88, 14.12, 90.83, datetime.datetime(2018, 5, 31, 10, 26, 42))]

