我有CSV x gb并想插入到mysql中,我会使用Go来实现,但是我没有找到正确的方法,有人这样做了吗?
我的专案:https://github.com/DevJoseWeb/AMCOM/tree/master/amcom-systems-go
答案 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 {
...
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 {
...