我正在使用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匹配datashape:var
NotImplementedError:没有SQLAlchemy dtype匹配datashape:float16
NotImplementedError:没有SQLAlchemy dtype匹配datashape:uint32
NotImplementedError:没有SQLAlchemy dtype匹配datashape:int8
理想情况下,我可以将int8映射到TINYINT,175 * var * string映射到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数据类型?
答案 0 :(得分:-2)
您可以尝试使用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