Загрузка CSV в MySQL с помощью odo и SQLAlchemy

Я использую odo для записи файла CSV в таблицу MySQL.

uri = 'mysql+pymysql://username:password@database/schema::table'
odo('data.csv', uri)

Когда я не указываю datashape, таблица MySQL создается со всеми строковыми столбцами как TEXT и всеми целочисленными столбцами как BIGINT(20). Итак, я попробовал следующий dataashape, и получил ошибки ниже:

dshape = '{} * {{ \
    ID: 10 * string, \
    FOO: float16, \
    URL: 175 * var * string, \
    PRICE: uint32, \
    BAR: int8, \
}}'.format(num_rows)
uri = 'mysql+pymysql://username:password@database/schema::table'
odo('data.csv', uri, dshape=dshape)

NotImplementedError: Нет совпадения dtype для SQLAlchemy для datashape: var

NotImplementedError: Нет совпадения dtype для SQLAlchemy для datashape: float16

NotImplementedError: Нет совпадения dtype SQLAlchemy для datashape: uint32

NotImplementedError: Нет совпадения dtype для SQLAlchemy для datashape: int8

В идеале я мог бы иметь, например, отображение int8 в TINYINT, отображение строки 175 * var * в VARCHAR(175) и отображение строки 10 * в CHAR(10), но, похоже, SQLAlchemy не поддерживает это. Я установил и установил все мои типы данных на int32 или float32, и я удалил обозначение var из моих строковых типов.

dshape = '{} * {{ \
    ID: 10 * string, \
    FOO: float32, \
    URL: 175 * string, \
    PRICE: int32, \
    BAR: int32, \
}}'.format(num_rows)
uri = 'mysql+pymysql://username:password@database/schema::table'
odo('data.csv', uri, dshape=dshape)

Это отображает int32 в INT(11) и float32 в DOUBLE. Я могу жить с этим. Но я не могу согласиться с тем, что все мои строковые столбцы по-прежнему записываются как текст в MySQL.

Как я должен изменить свой тип данных, чтобы получить типы данных CHAR и VARCHAR в MySQL?

1 ответ

Вы можете попробовать использовать панды и sqlalchemy, чтобы добиться того же

import pandas as pd
import sqlalchemy
from sqlalchemy import create_engine
engine = create_engine('mysql://username:password@host:port/database', echo=False)

#read csv into Dataframe
df = pd.read_csv('data.csv')

#write csv into Sql
df.to_sql('Table_Name', con=engine, if_exists='replace',index=False)

Он прочитает файл data.csv и поместит его в Table_Name в вашей базе данных.

Другие вопросы по тегам