3

odo を使用して CSV ファイルを MySQL テーブルに書き込みます。

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

datashapeを指定しないと、すべての文字列列が TEXT として、すべての整数列が BIGINT(20) として MySQL テーブルが作成されます。そこで、次のデータシェイプを試してみたところ、以下のエラーが発生しました。

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: SQLAlchemy dtype が datashape に一致しません: var

NotImplementedError: SQLAlchemy dtype が datashape に一致しません: float16

NotImplementedError: SQLAlchemy dtype が datashape に一致しません: uint32

NotImplementedError: SQLAlchemy dtype が 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 ですべての文字列列がまだ TEXT として書き込まれていることを受け入れることはできません。

MySQL で CHAR および VARCHAR データ型を取得するには、データシェイプをどのように変更する必要がありますか?

4

1 に答える 1

-3

pandas と 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に配置します。

于 2016-12-05T05:04:41.163 に答える