这里是一个演示:
import cx_Oracle
from sqlalchemy import types, create_engine
engine = create_engine('oracle://user:[email protected]_or_scan_address:1521:ORACLE_SID')
#engine = create_engine('oracle://user:[email protected]_or_scan_address:1521/ORACLE_SERVICE_NAME')
In [32]: df
Out[32]:
c_str c_int c_float
0 aaaaaaa 4 0.046531
1 bbb 6 0.987804
2 ccccccccccccc 7 0.931600
In [33]: df.to_sql('test', engine, index_label='id', if_exists='replace')
在Oracle DB:
SQL> desc test
Name Null? Type
------------------- -------- -------------
ID NUMBER(19)
C_STR CLOB
C_INT NUMBER(38)
C_FLOAT FLOAT(126)
现在
让我们指定的SQLAlchemy D型: 'VARCHAR(max_length_of_C_STR_column)':
In [41]: df.c_str.str.len().max()
Out[41]: 13
In [42]: df.to_sql('test', engine, index_label='id', if_exists='replace',
....: dtype={'c_str': types.VARCHAR(df.c_str.str.len().max())})
在Oracle DB:
SQL> desc test
Name Null? Type
--------------- -------- -------------------
ID NUMBER(19)
C_STR VARCHAR2(13 CHAR)
C_INT NUMBER(38)
C_FLOAT FLOAT(126)
PS为0的请@piRSquared's answer
这就是我要找的。真棒的东西。我是对的,CLOB是问题所在。它在转移中花费了很多时间。但您的解决方案大大缩短了传输时间。 – Mukul
@Mukul,我已经改变了一点代码,所以现在它动态地计算'C_STR'列的最大长度,在Oracle端创建一个包含'VARCHAR2(13 CHAR)'数据类型的列 – MaxU