【问题标题】:What's the recommended way to connect to MySQL from Go? [closed]从 Go 连接到 MySQL 的推荐方式是什么? [关闭]
【发布时间】:2012-07-05 23:00:36
【问题描述】:

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

【问题讨论】:

    标签: mysql database go


    【解决方案1】:

    一些驱动程序可用,但您应该只考虑那些实现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 文件中更改两行:执行导入的行和打开连接的行。

    【讨论】:

    • 非常感谢,我试试看。我喜欢 Go 提供库可以实现的 database/sql 包。
    • 非常适合新手的入门读物。谢谢。
    • 经过测试的驱动程序列表(也适用于其他 DBMS)可在 code.google.com/p/go-wiki/wiki/SQLDrivers 获得第二个流行的 MySQL 驱动程序:github.com/Go-SQL-Driver/MySQL(由我编写)
    • @JulienSchmidt 我编辑了我的答案以引用您的链接。如果你碰巧有这两个驱动程序之间的比较链接,那将是受欢迎的。
    • @Zeynel 这只是一个例子(取自this personal project)。我编辑用SomeThing 替换它。该行的重点是展示如何在没有中间变量的情况下直接用查询结果填充结构。
    【解决方案2】:

    注意事项 选择 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 的列,则会引发错误(不仅仅是警告)

    【讨论】:

    • 这不准确:QueryRow 函数返回 *Row。此函数断言查询返回单行。 Query() 返回 (*Rows, error),这确实需要调用 rows.Next()。
    【解决方案3】:

    我认为Gorm 是连接 Mysql 或 PostgreSQL 的完美方式。

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      相关资源
      最近更新 更多