2016-12-05 18 views
2

私はodoを使ってMySQLテーブルにCSVファイルを書き出しています。odoとSQLAlchemyを使ってMySQLにCSVをロード

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

私はdatashapeを指定しない場合は、MySQLのテーブルはBIGINT(20)のようにTEXTとすべての整数の列として、すべての文字列カラムで作成されます。だから、私は次のよう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

が、私はTINYINTにVARCHAR(175)に、175 * VAR *文字列のマップをINT8マップを持ってすることができるだろう、と10 * stringは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として書かれているということを受け入れることはできません。

MySQLでCHARデータ型とVARCHARデータ型を取得するには、datashapeをどのように変更する必要がありますか?

答えて

-1

あなたが同じ

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) 

を達成するためにパンダとSQLAlchemyのを使用して試すことができますそれはあなたのデータベースにdata.csvファイルを読み込み、TABLE_NAMEに入れます

+0

私はパンダを使用して開始しました非常に非効率的であることが判明しました。この記事では、MySQLにCSVをロードするためにパンダを使用しない理由を説明します:http://odo.pydata.org/en/latest/perf.htmlできるならば、私はそのオプションを避けています。 – Raddfood

関連する問題