<field>的类型不是带Oracle to_sql的SQLAlchemy类型到Oracle数据库

时间:2019-04-22 22:01:04

标签: pandas sqlalchemy

我有一个熊猫数据框,其中有几个分类字段。

SQLAlchemy引发异常“的类型不是SQLAlchemy类型”。 我尝试将对象字段转换回字符串,但是遇到相同的错误。

dfx = pd.DataFrame()
for col_name in df.columns:
    if(df[col_name].dtype == 'object'):
        dfx[col_name] = df[col_name].astype('str').copy()
    else:
        dfx[col_name] = df[col_name].copy()
    print(col_name, dfx[col_name].dtype)

 dfx.to_sql('results', con=engine, dtype=my_dtypes,  if_exists='append', method='multi', index=False)

尽管使用.copy()创建新表,但新dfx似乎具有相同的类别

此外,作为一个旁注,为什么to_sql()生成带有CLOB的CREATE TABLE?

1 个答案:

答案 0 :(得分:0)

这里不需要使用copy()函数,您也不必从'object'转换为'str'。

您正在写入Oracle数据库吗?文本数据(包括“对象”)的默认输出类型是CLOB。您可以通过指定要使用的dtype来解决它。例如:

import pandas as pd
from sqlalchemy import types, create_engine
from sqlalchemy.exc import InvalidRequestError 
conn = create_engine(...)

testdf = pd.DataFrame({'pet': ['dog','cat','mouse','dog','fish','pony','cat']
                      , 'count': [2,6,12,1,45,1,3]
                      , 'x': [105.3, 98.7, 112.4, 3.6, 48.9, 208.9, -1.7]})
test_types = dict(zip(
    testdf.columns.tolist(),
    (types.VARCHAR(length=20), types.Integer(), types.Float()) ))

try:
    testdf.to_sql( name="test", schema="myschema"
              , con=conn
              , if_exists='replace'  #'append'
              , index=False
              , dtype = test_types)
    print (f"Wrote final input dataset to table {schema}.{table2}")
except (ValueError, InvalidRequestError):
    print ("Could not write to table 'test'.")

如果您不写Oracle,请指定目标数据库-也许其他有DBMS经验的人可以为您提供建议。