如何用Python将CSV数据导入Oracle数据库?解决报错问题
解决Python导入CSV到Oracle数据库的报错问题
核心错误原因梳理
- ORA-01036: illegal variable name/number:cx_Oracle不支持
?作为占位符,需使用:1/:2这类位置占位符;同时number、date是Oracle保留关键字,列名必须用双引号包裹才能正确解析。 - executemany参数错误:该方法必须传入SQL语句和参数列表两个参数,且参数需为序列的序列(如列表的列表)。
- DataFrame遍历错误:直接
for r in csv遍历的是DataFrame的列名,而非行数据,需用itertuples()或iterrows()获取行内容。
方案一:cx_Oracle + pandas 手动批量插入
import cx_Oracle import pandas as pd # 建立数据库连接 conn_str = "spark/pass@localhost:1521/orcl" conn = cx_Oracle.connect(conn_str) curs = conn.cursor() # 读取CSV并转换为批量插入格式 csv_df = pd.read_csv('C:/Users/user/Downloads/products.csv') data_list = csv_df.values.tolist() # 修正SQL:保留字列名加双引号,使用cx_Oracle兼容的占位符 insert_sql = """ INSERT INTO PRODUCTS("number", "date", "code", "price") VALUES(:1, :2, :3, :4) """ # 批量插入并提交 curs.executemany(insert_sql, data_list) conn.commit() # 关闭资源 curs.close() conn.close()
方案二:pandas to_sql 简洁导入
利用pandas内置方法自动处理批量逻辑,无需手动操作游标:
import pandas as pd from sqlalchemy import create_engine # 创建Oracle连接引擎 engine = create_engine('oracle+cx_oracle://spark:pass@localhost:1521/orcl') # 读取CSV(若日期列格式异常,可添加parse_dates=['date']参数转换) csv_df = pd.read_csv('C:/Users/user/Downloads/products.csv') # 导入数据库 csv_df.to_sql( name='PRODUCTS', con=engine, if_exists='append', # 可选:append(追加)/replace(替换表)/fail(存在则报错) index=False, # 不导入DataFrame的索引列 chunksize=1000 # 分块插入,避免大文件内存溢出 )
注意事项
- 确保CSV列顺序与Oracle表列顺序完全匹配(方案一)。
- 方案二需先安装依赖:
pip install sqlalchemy。 - 提前验证Oracle表的字段类型与CSV数据类型兼容,如日期列需确保格式可被Oracle识别。
内容的提问来源于stack exchange,提问作者SpaEngi
相关产品推荐
相关产品推荐

