【发布时间】:2021-11-03 10:19:55
【问题描述】:
我需要在 oracle sql 中插入一个数据帧,我能找到的最快方法是 sqlalchemy,但这似乎对我不利。
我的代码:
import pandas as pd
from sqlalchemy.engine import create_engine
from sqlalchemy import types
import cx_Oracle
DIALECT = 'oracle'
SQL_DRIVER = 'cx_oracle'
USERNAME = 'NCSWEB' #enter your username
PASSWORD = '########' #enter your password
HOST = '192.168.213.151' #enter the oracle db host url
PORT = 1515 # enter the oracle port number
SERVICE = 'devnc12c' # enter the oracle db service name
ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE
engine = create_engine(ENGINE_PATH_WIN_AUTH)
print(engine)
#read data from csv
fileName='C:\\Users\\ncdex1124\Desktop\\New folder\\file4.csv'
df = pd.read_csv(fileName)
print(df)
dtyp = {c:types.VARCHAR(df[c].str.len().max())
for c in df.columns[df.dtypes == 'object'].tolist()}
try:
df.to_sql('UCIDBA.FUT_CLIENT_LIST_COPY', engine.connect(), if_exists='append', index=False, chunksize=10000,dtype=dtyp)
except Exception as e:
print(e)
print("Record inserted successfully")
输出:
Traceback (most recent call last):
File "C:\Users\ncdex1124\AppData\Local\Programs\Python\Python39\lib\site-packages\sqlalchemy\engine\base.py", line 1751, in _execute_context
self.dialect.do_executemany(
File "C:\Users\ncdex1124\AppData\Local\Programs\Python\Python39\lib\site-packages\sqlalchemy\dialects\oracle\cx_oracle.py", line 1347, in do_executemany
cursor.executemany(statement, parameters)
cx_Oracle.DatabaseError: DPI-1080: connection was closed by ORA-3135
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\ncdex1124\AppData\Local\Programs\Python\Python39\lib\site-packages\sqlalchemy\engine\base.py", line 1866, in _safe_close_cursor
cursor.close()
cx_Oracle.DatabaseError: DPI-1010: not connected
(cx_Oracle.DatabaseError) DPI-1010: not connected
(Background on this error at: https://sqlalche.me/e/14/4xp6)
我不明白在这种情况下出了什么问题。
【问题讨论】:
-
两个 cmets:(1) 因为您有一个 CSV 文件,所以使用 SQL*Loader 以获得最佳性能,例如 stackoverflow.com/a/69090794/4799035 (2) 如果您想继续使用 Python,请使用 cx_Oracle 的
executeMany()函数查看直接这样您就可以控制错误处理,请参阅cx-oracle.readthedocs.io/en/latest/user_guide/…,其中有一个 CSV 示例
标签: python pandas oracle dataframe sqlalchemy