我正在使用 odo 将 CSV 文件写入 MySQL 表。
uri = 'mysql+pymysql://username:password@database/schema::table'
odo('data.csv', uri)
当我没有指定datashape时,将创建 MySQL 表,其中所有字符串列作为 TEXT,所有整数列作为 BIGINT(20)。所以,我尝试了以下数据形状,并得到以下错误:
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 匹配:var
NotImplementedError:数据形状没有 SQLAlchemy dtype 匹配:float16
NotImplementedError:没有与数据形状匹配的 SQLAlchemy dtype:uint32
NotImplementedError:数据形状没有 SQLAlchemy dtype 匹配: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 数据类型?