的类型< field>不是具有Oracle数据库Pandas to_sql的SQLAlchemy类型

lfapxunr  于 2023-02-11  发布在  Oracle
关注(0)|答案(2)|浏览(151)

我有一个Pandas的数据框架,有几个分类字段。
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?

5n0oy7gb

5n0oy7gb1#

这里不需要使用copy()函数,也不需要将'object'转换为'str'。
您正在写入Oracle数据库吗?文本数据(包括“object”)的默认输出类型是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经验的人可以为您提供建议。

lvmkulzt

lvmkulzt2#

@eknumbat是绝对正确的。对于AWS Redshift,你可以做以下操作。注意你可以在这里找到所有的sqlalchemy数据类型(https://docs.sqlalchemy.org/en/14/core/types.html

import pandas as pd
from sqlalchemy.types import VARCHAR, INTEGER, FLOAT
from sqlalchemy import create_engine

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 = {'pet': VARCHAR, 'count': Integer, 'x': Float}

testdf.to_sql(name="test", 
              schema="myschema".
              con=conn,
              if_exists='replace',
              index=False,
              dtype = test_types)

相关问题