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
コマンドを実行し、その行は正常に挿入されます。
私には何が欠けていますか?