使用odo和SQLAlchemy将CSV加载到MySQL

时间:2016-12-05 04:50:03

标签: python mysql sqlalchemy odo datashape

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

1 个答案:

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