mac instant cx_oracle close python python-3.x pandas dataframe

python - instant - La columna de pandas(cadena/objeto) como VARCHAR en Oracle DB en lugar de CLOB(comportamiento predeterminado)



python cx_oracle types (2)

use str.zfill

df[''product''].astype(str).str.zfill(9) 0 000012320 1 000234234 Name: product, dtype: object

Estoy intentando transferir un marco de datos a la base de datos de Oracle, pero la transferencia lleva demasiado tiempo, porque el tipo de datos de la variable se muestra como clob en el oráculo. Sin embargo, creo que si convierto el tipo de datos de clob a cadena de 9 dígitos con 0 rellenos , no tomará mucho tiempo. los datos son

product 000012320 000234234

¿Hay alguna manera de cambiar el tipo de datos de esta variable a cadena de 9 dígitos? para que Oracle no lo considere como un objeto CLOB. He probado lo siguiente.

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

o hay algo más que pueda ralentizar la transferencia de Python a Oracle?


Aquí hay una demostración:

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'')

En Oracle DB:

SQL> desc test Name Null? Type ------------------- -------- ------------- ID NUMBER(19) C_STR CLOB C_INT NUMBER(38) C_FLOAT FLOAT(126)

ahora especifiquemos un 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())})

En Oracle DB:

SQL> desc test Name Null? Type --------------- -------- ------------------- ID NUMBER(19) C_STR VARCHAR2(13 CHAR) C_INT NUMBER(38) C_FLOAT FLOAT(126)

PD para rellenar su cadena con 0, compruebe la respuesta de @ piRSquared