【问题标题】:Save pandas (string/object) column as VARCHAR in Oracle DB instead of CLOB (default behaviour)在 Oracle DB 中将 pandas(字符串/对象)列保存为 VARCHAR 而不是 CLOB(默认行为)
【发布时间】:2017-01-23 01:56:38
【问题描述】:

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

product
000012320
000234234

有没有办法将此变量的数据类型更改为 9 位字符串。所以 oracle 不会将其视为 CLOB 对象。我尝试了以下方法。

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

或者是否有其他东西可能会减慢从 python 到 oracle 的传输速度?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    使用str.zfill

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

    【讨论】:

    • 感谢您的回复。但它仍然显示为 CLOB 对象,还是任何字符串对象都被转移到 oracle 的情况?数据类型会一直是 CLOB 吗,oracle 中不应该是 varchar 吗?
    • @Mukul 我对 oracle 或 CLOB 对象一无所知。您问 >“有没有办法将此变量的数据类型更改为 9 位数字字符串”。我可以回答这个问题。很抱歉没有成功。
    【解决方案2】:

    这是一个演示:

    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 数据库中:

    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 数据库中:

    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

    【讨论】:

    • 这就是我要找的。很棒的东西。我是对的,CLOB 是问题所在。转移花费了很多时间。但您的解决方案显着缩短了传输时间。
    • @Mukul,我稍微更改了代码,所以现在它动态计算C_STR 列的最大长度,并在Oracle 端创建一个具有VARCHAR2(13 CHAR) 数据类型的列
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2023-03-30
    • 2019-07-12
    • 1970-01-01
    • 2022-06-11
    • 2015-01-31
    • 1970-01-01
    相关资源
    最近更新 更多