如何将数据从CSV导入MySQL

时间:2018-07-19 06:39:41

标签: go

我有CSV x gb并想插入到mysql中,我会使用Go来实现,但是我没有找到正确的方法,有人这样做了吗?

我的专案:https://github.com/DevJoseWeb/AMCOM/tree/master/amcom-systems-go

1 个答案:

答案 0 :(得分:1)

不管使用哪种语言,都有两种基本方法。首先是您自己读取和解析CSV文件,然后一次插入一行。这效率低下。

另一种方法是使用MySQL的load data local infile将CSV文件加载到表中,以便MySQL完成所有工作。 local部分意味着您将向MySQL发送CSV文件。

与其他SQL语句不同,这需要特殊的客户端支持才能读取和发送CSV文件。幸运的是go-sql-driver you're using has this support并指出了一些警告。

  

必须通过在mysql中注册文件来将其列入白名单.RegisterLocalFile(filepath)(推荐),或者必须使用DSN参数allowAllFiles = true禁用白名单检查(可能不安全!)。

     

要使用io.Reader,必须向mysql.RegisterReaderHandler(name,handler)注册处理函数,该函数返回io.Reader或io.ReadCloser。阅读器可与文件路径阅读器::一起使用。当您不再需要此名称时,请为不同的处理程序和DeregisterReaderHandler选择不同的名称。

     

有关详细信息,请参阅Go-MySQL-Driver的godoc。

Go-MySQL-Driver包含示例。使用RegisterLocalFile ...

filePath := "/home/gopher/data.csv"
mysql.RegisterLocalFile(filePath)
err := db.Exec("LOAD DATA LOCAL INFILE '" + filePath + "' INTO TABLE foo")
if err != nil {
...

使用RegisterReaderHandler

mysql.RegisterReaderHandler("data", func() io.Reader {
    var csvReader io.Reader // Some Reader that returns CSV data
    ... // Open Reader here
    return csvReader
})
err := db.Exec("LOAD DATA LOCAL INFILE 'Reader::data' INTO TABLE foo")
if err != nil {
...