2017-05-21 6 views
0

go-sql-driverを使用してmysqlに接続します。goから大量の行(34M +)を挿入することをお勧めします。RegisterReaderHandlerを使用してmysqlに行を挿入する

as shown on the RegisterReaderHandler documentationをロードするのに、io.Readerを使用するのが苦労しています。

私はこの

CREATE TABLE `test` (
    `Id` int(11) NOT NULL, 
    `One` varchar(45) DEFAULT NULL, 
    `Two` varchar(45) DEFAULT NULL, 
    `Three` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`Id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

のように定義されたテーブルを持っていると私は私のRead操作が呼び出されることがわかり

func (r MyReader) Read(p []byte) (n int, err error){ 
    buf := new(bytes.Buffer) 
    wr := csv.NewWriter(buf) 

    // just generate a csv line to see if this works 
    // I've verified that the size of the result is lower than p's capacity 
    wr.Write([]string{"1", "Something", "NULL", "Something"}) 
    wr.Flush() 

    p = buf.Bytes()  
    return len(p), io.EOF 
} 

func main() { 
    mysql.RegisterReaderHandler("data", func() io.Reader { 
     // pass my reader 
     return MyReader{} 
    }) 

    db, err := sql.Open("mysql", "user:[email protected]/db") 
    checkErr(err) 

    _, err = db.Exec("LOAD DATA LOCAL INFILE 'Reader::data' INTO TABLE test FIELDS TERMINATED BY ','") 
    checkErr(err) 
} 

を実行して行を挿入しようとすると、このAを実行した後にしています新しい要素が作成されます。しかし、それはId 0であり、他のすべての要素はNULLなので、データを正しく処理していません。

FWIWの場合、mysqlで(リーダーと同じ内容で)LOAD DATA LOCALコマンドを実行し、その行は正常に挿入されます。

私には何が欠けていますか?

答えて

0

明らかに、質問を投稿してから3分後、私は答えを見つけ出しました。

出力バッファをMyReaderに置き換えました。だから、

out = buf.Bytes() 
copy(p, out) 

でトリック

をライン

p = buf.Bytes() 

を変えませんでした

関連する問題