如何使用to_sql将熊猫框架存储到数据库中

时间:2020-04-09 15:39:11

标签: pandas sqlalchemy

Am使用以下代码尝试将数据帧存储到oracle表中 如果省略dtype={'PN': types.VARCHAR}

,则数据插入成功
merged.to_sql('table1', conn, if_exists='append', index=False, dtype={'PN': types.VARCHAR})

否则会抛出

sqlalchemy.exc.OperationalError: (cx_Oracle.OperationalError) ORA-00604: error occurred at recursive SQL level 1
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 13
ORA-00906: missing left parenthesis
[SQL: 
CREATE TABLE tabl1(
    "PN" VARCHAR, 
    "DT" DATE, 
    "COL1" FLOAT, 
    "COL2" NUMBER(19), 
    "COL3" NUMBER(19), 
    "COL4" FLOAT, 
    "COL5" FLOAT, 
    "COL6" FLOAT
)

]

1 个答案:

答案 0 :(得分:0)

Oracle期望“创建表” DDL语句中varchar列的长度。如Gord所建议,在括号中提供一个介于1到255之间的值将解决此问题。您可以尝试dtype = {'PN':types.VARCHAR(255)}。 如果您想知道数据库中发生了什么,我已经在dbfiddle-Oracle 18c Express版本上重现了该问题,您可以检出该问题。 https://dbfiddle.uk/?rdbms=oracle_18&fiddle=9362757cfcb1cfc3052425190367d3d8

由于以下原因,我不建议使用varchar来存储字母数字数据:

  1. 比较语义当您需要ANSI时使用CHAR数据类型 比较语义上的兼容性,即在尾随空白时 在字符串比较中不重要。在以下情况下使用VARCHAR2 尾随空格在字符串比较中很重要。
  2. 空间使用情况若要更有效地存储数据,请使用VARCHAR2 数据类型。 CHAR数据类型空白填充并存储尾随空白 到所有列值的固定列长,而VARCHAR2 数据类型不能空白填充或存储列的尾随空白 值。
  3. 未来兼容性CHAR和VARCHAR2数据类型是并且将是 始终得到完全支持。这时,VARCHAR数据类型 自动对应于VARCHAR2数据类型并被保留 供将来使用。