2016-09-15 137 views
4

我试图将数据帧传输到oracle数据库,但传输时间过长,因为变量的数据类型正在显示在oracle中为clob。不过,我相信如果我将数据类型从clob转换为字符串9位填充0的,它不会花费很多时间。数据是将pandas(字符串/对象)列保存为Oracle DB中的VARCHAR而不是CLOB(默认行为)

product 
000
000234234 

是否有方法将此变量的数据类型更改为9位数的字符串。这样oracle就不会将其视为CLOB对象。我已经尝试了以下。

df['product']=df['product'].astype(str) 

还是有其他的东西,可能会减缓从Python到甲骨文的转移?

回答

2

这里是一个演示:

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

+0

这就是我要找的。真棒的东西。我是对的,CLOB是问题所在。它在转移中花费了很多时间。但您的解决方案大大缩短了传输时间。 – Mukul

+0

@Mukul,我已经改变了一点代码,所以现在它动态地计算'C_STR'列的最大长度,在Oracle端创建一个包含'VARCHAR2(13 CHAR)'数据类型的列 – MaxU

0

使用str.zfill

df['product'].astype(str).str.zfill(9) 

0 000
1 000234234 
Name: product, dtype: object 
+0

感谢您的答复填充您的字符串。但它仍然显示为CLOB对象,或者是否将任何字符串对象转移到oracle?数据类型是否总是CLOB,如果它不是oracle中的varchar? – Mukul

+0

@Mukul我对oracle或CLOB对象一无所知。你问>“有没有办法将这个变量的数据类型改为9位数的字符串”。我可以回答。对不起,它没有解决。 – piRSquared

相关问题