【发布时间】:2012-07-05 23:00:36
【问题描述】:
我正在寻找一种可靠的解决方案来从 Go 连接到 MySQL 数据库。我看过一些图书馆,但很难确定完整性和当前维护的不同状态。我没有复杂的需求,但我想知道人们依赖什么或连接 MySQL 的最标准解决方案。
【问题讨论】:
我正在寻找一种可靠的解决方案来从 Go 连接到 MySQL 数据库。我看过一些图书馆,但很难确定完整性和当前维护的不同状态。我没有复杂的需求,但我想知道人们依赖什么或连接 MySQL 的最标准解决方案。
【问题讨论】:
一些驱动程序可用,但您应该只考虑那些实现database/sql API 的驱动程序
为 MySQL 提供了两个快速可靠的驱动程序:
我在生产中都使用了它们,程序运行了几个月,连接数达到数百万,没有失败。
其他 SQL 数据库驱动程序are listed on go-wiki。
使用 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 文件中更改两行:执行导入的行和打开连接的行。
【讨论】:
SomeThing 替换它。该行的重点是展示如何在没有中间变量的情况下直接用查询结果填充结构。
注意事项 选择 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 的列,则会引发错误(不仅仅是警告)
【讨论】:
我认为Gorm 是连接 Mysql 或 PostgreSQL 的完美方式。
【讨论】: