微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 将pandas(字符串/对象)列保存为Oracle DB中的VARCHAR而不是CLOB(默认行为)

我正在尝试将数据帧传输到oracle数据库,但传输时间过长,因为变量的数据类型在oracle中显示为clob.但是,我相信如果我将数据类型从clob转换为带有填充0的9位数的字符串,它将不会花费那么多时间.数据是

product
000012320
000234234

有没有办法将此变量的数据类型更改为9位数的字符串.这样oracle就不会把它当作CLOB对象.我试过以下.

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

或者还有什么可能会减慢从python到oracle的转移?

解决方法:

这是一个演示:

import cx_Oracle
from sqlalchemy import types, create_engine
engine = create_engine('oracle://user:password@host_or_scan_address:1521:ORACLE_SID')
#engine = create_engine('oracle://user:password@host_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 dtype:’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)

用0填充你的字符串的PS请检查@piRSquared’s answer

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐