我正在使用 go-sql-driver
从 go
连接到 mysql
,我很想用一个阅读器来插入大量行 (34M+)。
我很难使用 io.Reader
加载数据 as shown on the RegisterReaderHandler documentation .
我有一个这样定义的表
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
我正在尝试插入一行
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:pass@/db")
checkErr(err)
_, err = db.Exec("LOAD DATA LOCAL INFILE 'Reader::data' INTO TABLE test FIELDS TERMINATED BY ','")
checkErr(err)
}
我看到调用了我的 Read
操作,运行后创建了一个新元素。但是,它的 Id
为 0 并且所有其他元素都是 NULL
,因此它没有正确处理数据。
FWIW,我在 mysql
中运行了 LOAD DATA LOCAL
命令(读卡器生成的内容相同),该行已成功插入。
我错过了什么?
最佳答案
显然,在发布问题 3 分钟后我找到了答案。
我正在替换 MyReader
中的输出缓冲区。所以换行
p = buf.Bytes()
与
out = buf.Bytes()
copy(p, out)
成功了
关于mysql - 使用 RegisterReaderHandler 在 mysql 中插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44101462/