加载驱动程序包后,就可以创建数据库对象了,一个sql.DB

要创建sql.DB,请使用sql.Open()。这将返回一个*sql.DB

func main() {
    db, err := sql.Open("mysql",
        "user:password@tcp(127.0.0.1:3306)/hello")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
}

在所示的示例中,我们说明了几件事:

  1. sql.Open的第一个参数是,驱动程序名称。这是驱动程序用来在database/sql中进行自身注册的字符串,通常与包名称相同,以避免混淆。例如,mysql 用于 github.com/go-sql-driver/mysql 。某些驱动程序不遵循约定,而是使用数据库名称,例如,用于 github.com/mattn/go-sqlite3sqlite3 和用于 github.com/lib/pqpostgres
  2. 第二个参数是,特定于驱动程序的语法,它告诉驱动程序如何访问基础数据存储。在此示例中,我们将连接到本地 MySQL 服务器实例内的「hello」数据库。
  3. 您(几乎)应该始终检查并处理从所有 database/sql 操作返回的错误。我们将在以后讨论一些特殊情况,以解决此问题。
  4. 如果 sql.DB 的生存期不应超出该功能的范围,则推迟 db.Close() 是习惯的做法。

也许违反直觉,sql.Open() 不会建立与数据库的任何连接,也不会验证驱动程序的连接参数。而是它只准备数据库抽象以备后用。与基础数据存储区的第一个实际连接将延迟到第一次需要时建立。如果要立即检查数据库是否可用和可访问(例如,检查是否可以建立网络连接并登录),请使用 db.Ping() 进行操作,并记录检查错误:

err = db.Ping()
if err != nil {
    // do something here
}

虽然在完成后对 Close() 数据库很习惯,但是 sql.DB 对象被设计为长期存在。不要经常使用 Open()Close()。而是为每个需要访问的不同数据存储创建 一个 sql.DB 对象,并保留该对象直到程序完成对该数据存储的访问为止。根据需要传递它,或以某种方式使其在全局范围内可用,但保持打开状态。不要通过短期函数来 Open()Close()。而是将 sql.DB 传递给该短期函数作为参数。

如果不将 sql.DB 视为长期对象,则可能会遇到诸如重用和连接共享不良,可用网络资源用尽或由于很多原因而导致的偶发性故障等问题 TIME_WAIT 状态中剩余的 TCP 连接数。这些问题表明您没有使用设计的 database/sql

现在该使用您的 sql.DB 对象了。

转自:https://learnku.com/docs/go-database-sql/accessing/9476

最后编辑: kuteng  文档更新时间: 2021-11-19 09:18   作者:kuteng