从 Go 连接到 MySQL 的推荐方法是什么?

新手上路,请多包涵

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

原文由 Sergi Mansilla 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 391
2 个回答

有一些驱动程序可用,但您应该只考虑那些实现 数据库/sql API 的驱动程序

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

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

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

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

使用 MyMySQL 时导入:

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

使用 Go-MySQL-Driver 时导入:

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

使用 MyMySQL 连接和关闭:

 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 连接和关闭:

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

选择一行:

 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)

选择多行并构建一个包含结果的数组:

 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)

您会发现在 Go 中与 MySQL 一起工作是一种愉快的体验:我 从来没有 遇到过问题,我的服务器运行了几个月没有错误或泄漏。大多数函数只接受可变数量的参数这一事实减轻了一项在许多语言中单调乏味的任务。

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

原文由 Denys Séguret 发布,翻译遵循 CC BY-SA 3.0 许可协议

有几件事需要注意选择 1 行示例:

 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)

在此示例中缺少 row.Next() 。它需要调用 row.Next() 来获取返回的第一行。

图书馆也有一些不灵活之处,它以某种方式试图促进数据极简主义。如果您尝试选择不是 Scan 的列,它将抛出错误(不仅仅是警告)

原文由 Badoet 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题