3

我正在使用 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 数据类型?

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 回答