一 点睛
Go 官方没有提供数据库驱动,而是为开发数据库驱动定义了一些标准接口,开发者可以根据定义的接口来开发相应的数据库驱动,这样做有一个好处是:只要是按照标准接口开发的代码, 以后需要迁移数据库时,不需要任何修改。
二 sql.Register
该函数存在于 database/sql 包,它的作用是注册数据库驱动,当第三方开发者开发数据库驱动时,都会实现 init 函数,在 init 里面会调用 Register(name string, driver driver.Driver) 完成数据库驱动的注册。
mysql 和 sqlite3 的驱动调用方式。
// https://github.com/mattn/go-sqlite3 驱动
func init() {
sql.Register("sqlite3", &SQLiteDriver{})
}
// https://github.com/mikespook/mymysql 驱动
// Driver automatically registered in database/sql
var d = Driver{proto: "tcp", raddr: "127.0.0.1:3306"}
func init() {
Register("SET NAMES utf8")
sql.Register("mymysql", &d)
}
第三方数据库驱动都是通过调用这个函数来注册自己的数据库驱动名称以及相应的driver实现。在database/sql 内部通过一个 map 来存储用户定义的相应驱动。
var drivers = make(map[string]driver.Driver)
drivers[name] = driver
因此通过 database/sql 注册函数可以同时注册多个数据库驱动,只要不重复。
例如:
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
_ 是用来忽略变量赋值的占位符,包引入用到这个符号也是相似的作用,它表示引入后面