mysql - 使用 RegisterReaderHandler 在 mysql 中插入行

标签 mysql go

我正在使用 go-sql-drivergo 连接到 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/

相关文章:

mysql - 检测两个时间是否冲突/相交

go - 如何高效关闭 channel ?

go - 结构的 golang 映射如何作为键类型工作?

Golang cmd.Start() 有时卡在 fuse 安装目录上

mysql - 获取用户未对 SQL 查询投票的所有配置文件

java - ZonedDateTime 持久化到 SQL 数据库

mysql - SQL SELECT (MySQL) 中的条件检查功能?

javascript - 新的 mysql 条目自动刷新

google-app-engine - 数据存储四舍五入的时间字段

go - kubernetes API中是否有通过注解获取所有服务的函数