Тип <field>не является типом SQLAlchemy с Pandas to_sql для базы данных Oracle - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть фрейм данных 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)

новый dfx, похоже, имеет те же категории, несмотря на создание новой таблицы с .copy ()

Кроме того, как примечание, почему to_sql () генерирует CREATE TABLE с CLOB?

1 Ответ

0 голосов
/ 21 мая 2019

Здесь нет необходимости использовать функцию 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, укажите свою целевую базу данных - возможно, кто-то другой, имеющий опыт работы с этой СУБД, может посоветовать вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...