我正在尝试将数据帧传输到oracle数据库,但是传输时间太长,因为变量的数据类型在oracle中显示为clob。但是我相信,如果我将数据类型从clob转换为带有填充0的9位字符串,则不会花费那么多时间。数据是
product
000012320
000234234
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以将此变量的数据类型更改为9位数字的字符串。因此,oracle不会将其视为CLOB对象。我已经尝试了以下。
df['product']=df['product'].astype(str)
Run Code Online (Sandbox Code Playgroud)
还是有其他东西可能会减慢从python到oracle的传输?
使用pandas dataframe的to_sql方法,我可以很容易地将少量行写入oracle数据库中的表:
from sqlalchemy import create_engine
import cx_Oracle
dsn_tns = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=1521))\
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=<servicename>)))"
pwd = input('Please type in password:')
engine = create_engine('oracle+cx_oracle://myusername:' + pwd + '@%s' % dsn_tns)
df.to_sql('test_table', engine.connect(), if_exists='replace')
Run Code Online (Sandbox Code Playgroud)
但是对于任何常规大小的数据帧(我的有60k行,不是那么大),代码变得无法使用,因为它在我愿意等待的时间内(从而超过10分钟)从未完成.我用Google搜索并搜索了几次,最接近的解决方案是ansonw在这个问题中给出的答案.但那个是关于mysql,而不是oracle.正如Ziggy Eunicien指出的那样,它对甲骨文不起作用.有任何想法吗?
编辑
以下是数据框中的行示例:
id name premium created_date init_p term_number uprate value score group action_reason
160442353 LDP: Review 1295.619617 2014-01-20 1130.75 1 7 -42 236.328243 6 pass
164623435 TRU: Referral 453.224880 2014-05-20 0.00 11 NaN -55 38.783290 1 suppress
Run Code Online (Sandbox Code Playgroud)
这是df的数据类型:
id int64
name object …Run Code Online (Sandbox Code Playgroud)