2016-12-05 55 views
2

我正在使用odo將CSV文件寫入MySQL表。使用odo和SQLAlchemy將CSV加載到MySQL

uri = 'mysql+pymysql://username:[email protected]/schema::table' 
odo('data.csv', uri) 

當我不指定datashape,MySQL表得到的所有字符串列TEXT和所有整列作爲BIGINT(20)創建的。於是,我嘗試了以下datashape,並得到了以下錯誤:

dshape = '{} * {{ \ 
    ID: 10 * string, \ 
    FOO: float16, \ 
    URL: 175 * var * string, \ 
    PRICE: uint32, \ 
    BAR: int8, \ 
}}'.format(num_rows) 
uri = 'mysql+pymysql://username:[email protected]/schema::table' 
odo('data.csv', uri, dshape=dshape) 

NotImplementedError: No SQLAlchemy dtype match for datashape: var

NotImplementedError: No SQLAlchemy dtype match for datashape: float16

NotImplementedError: No SQLAlchemy dtype match for datashape: uint32

NotImplementedError: No SQLAlchemy dtype match for datashape: int8

理想情況下,我能有INT8地圖TINYINT,175 *變種*字符串映射到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:[email protected]/schema::table' 
odo('data.csv', uri, dshape=dshape) 

這將int32映射到INT(11)和float32到DOUBLE。我可以忍受這一點。但我不能接受,我的所有字符串列仍被寫爲MySQL上的TEXT。

我該如何改變我的datashape才能在MySQL中獲取CHAR和VARCHAR數據類型?

回答

-1

你可以嘗試使用熊貓的SQLAlchemy來達到同樣的

import pandas as pd 
import sqlalchemy 
from sqlalchemy import create_engine 
engine = create_engine('mysql://username:[email protected]: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在你的數據庫

+0

我開始使用的大熊貓,但發現它效率很低。這篇文章解釋了爲什麼不使用熊貓將CSV加載到MySQL中:http://odo.pydata.org/en/latest/perf.html所以我會盡量避免使用這個選項。 – Raddfood