Загрузка 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 в вашей базе данных.