扫码订阅《 》或入驻星球,即可阅读文章!

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go学习
  • Go学院

    • Go小课
    • Go视界
    • Go小考
    • Go实战
  • Go资源

    • 优质课程
    • 在线宝典
    • 资源下载
    • 帮找资源
训练营 🔥
  • Go体系课&实战训练营
  • 升值加薪陪跑训练营
Go求职
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
  • 求职服务

    • 内推互助
    • 求职助力
    • 内推公司
Go友会
  • 城市
  • 校园
推广返佣
  • 返佣排行
  • 返佣规则
  • 推广学院
实验区
  • Go周边
  • Go宝典

    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
更多
  • 用户中心

    • 我的信息
    • 我的返佣
    • 我的消息
  • 玩转星球

    • 星球介绍
    • 星主权益
    • 吐槽专区
    • 成长记录
  • 合作交流

    • 商务合作
    • 讲师招募
    • 生态伙伴
author-avatar

GOLANG ROADMAP


首页
Go学习
  • Go学院

    • Go小课
    • Go视界
    • Go小考
    • Go实战
  • Go资源

    • 优质课程
    • 在线宝典
    • 资源下载
    • 帮找资源
训练营 🔥
  • Go体系课&实战训练营
  • 升值加薪陪跑训练营
Go求职
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
  • 求职服务

    • 内推互助
    • 求职助力
    • 内推公司
Go友会
  • 城市
  • 校园
推广返佣
  • 返佣排行
  • 返佣规则
  • 推广学院
实验区
  • Go周边
  • Go宝典

    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
更多
  • 用户中心

    • 我的信息
    • 我的返佣
    • 我的消息
  • 玩转星球

    • 星球介绍
    • 星主权益
    • 吐槽专区
    • 成长记录
  • 合作交流

    • 商务合作
    • 讲师招募
    • 生态伙伴

扫码订阅《 》或入驻星球,即可阅读文章!

3.连接数据库


GOLANG ROADMAP

加载驱动程序包后,就可以创建数据库对象了,一个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
2
3
4
5
6
7
8

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

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

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

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

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

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

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