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