从Go连接到MySQL的build议方法是什么?

我正在寻找一个可靠的解决scheme,从Go连接到MySQL数据库。 我已经看到了一些图书馆,但很难确定完整性和当前维护的不同状态。 我没有复杂的需求,但是我想知道人们依赖什么,或者什么是连接到MySQL的最标准的解决scheme。

一些驱动程序是可用的,但你应该只考虑那些实现数据库/ SQL API为

  • 它提供了一个干净而高效的语法,
  • 它确保您以后可以更改驱动程序而不更改您的代码,除了导入和连接。

两个快速可靠的驱动程序可用于MySQL:

  • MyMySQL
  • GO-MySQL的驱动程序

我已经在生产中使用了它们两个,程序运行了数月,连接数以百万计,没有失败。

其他SQL数据库驱动程序在go-wiki上列出 。

使用MyMySQL时导入:

import ( "database/sql" _ "github.com/ziutek/mymysql/godrv" ) 

使用Go-MySQL-Driver时导入:

 import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) 

使用MyMySQL连接和closures:

 con, err := sql.Open("mymysql", database+"/"+user+"/"+password) defer con.Close() // here you can use the connection, it will be closed when function returns 

使用Go-MySQL-Driver连接和closures:

 con, err := sql.Open("mysql", store.user+":"+store.password+"@/"+store.database) defer con.Close() 

select一行:

 row := con.QueryRow("select mdpr, x, y, z from sometable where id=?", id) cb := new(SomeThing) err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z) 

select多行并用结果构build一个数组:

 rows, err := con.Query("select a, b from item where p1=? and p2=?", p1, p2) if err != nil { /* error handling */} items := make([]*SomeStruct, 0, 10) var ida, idb uint for rows.Next() { err = rows.Scan(&ida, &idb) if err != nil { /* error handling */} items = append(items, &SomeStruct{ida, idb}) } 

插 :

 _, err = con.Exec("insert into tbl (id, mdpr, isok) values (?, ?, 1)", id, mdpr) 

您将会看到,使用MySQL进行工作是一个令人愉快的经历:我从来没有遇到过问题,我的服务器运行了好几个月没有错误或泄漏。 事实上,大多数function只是采取了不同数量的论点,减轻了许多语言中乏味的任务。

请注意,如果将来您需要使用另一个MySQL驱动程序,则只需一次性更改两行文件:执行导入的行和打开连接的行。

几件事要注意select1行的例子:

 row := con.QueryRow("select mdpr, x, y, z from sometable where id=?",id) cb := new(SomeThing) err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z) 

在这个例子中有一个缺less的row.Next() 。 它需要调用row.Next()来获取返回的第一行。

图书馆也有一些不灵活的地方,以某种方式来促进数据极简。 如果您尝试select不是“扫描”的列,将会抛出错误(而不仅仅是警告)