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 データ型を取得するには、データシェイプをどのように変更する必要がありますか?