学习gorm系列一:创建数据库连接
大家好,我是渔夫子。公众号:Go 学堂
所以本系列文章意在深入的学习 gorm,以便更好的理解和使用 gorm,而不是简单的使用增、删、改、查功能。
什么是 gorm#
gorm 是用于 golang 编程的非常优秀的 ORM 库,可使开发者对数据库使用更为方便。该库不仅支持多种数据库。而且还提供了查询构建器、关系映射、事务等多种功能。
初始化数据库连接:gorm.Open#
要针对数据库进行操作,第一步就是要创建一个和数据库的连接。在 gorm 中使用的就是 gorm.Open
函数。接下来就们就看一下 gorm.Open 都做了些什么事儿。
假设我们要连接一个 mysql 数据库,像如下代码这样就能建立数据的连接:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}
我们看到上面的代码还依赖了 mysql 的驱动库:gorm.io/driver/mysql
,该库是 mysql 的驱动库。这个就是要告诉 gorm 要连接的具体数据库了。 在 go-gorm 项目下还能找到 sqlite
、sqlserver
、postgres
以及 clickhouse
等常用的数据库的驱动库。地址是:github.com/go-gorm 目录下。
我们再看下 gorm.Open 的函数原型:
func Open(dialector Dialector, opts ...Option) (db *DB, err error)
第一个参数是 Dialector 接口。该接口定义如下:
type Dialector interface {
Name() string
Initialize(*DB) error
Migrator(db *DB) Migrator
DataTypeOf(*schema.Field) string
DefaultValueOf(*schema.Field) clause.Expression
BindVarTo(writer clause.Writer, stmt *Statement, v interface{})
QuoteTo(clause.Writer, string)
Explain(sql string, vars ...interface{}) string
}
看到这里就明白了,只要具体的数据库驱动实现了该接口,gorm 就能支持该数据库的连接。也就是说上面我们提到的 go-gorm 目录下的各种具体的数据库驱动都实现了 Dialector 接口。
dsn 是什么#
dsn,即 data source name,指的是数据源名称。在 golang 中,其格式如下:
[user[:password]@][net[(addr)]]/dbname[?param1=value1¶mN=valueN]
mysql.Open 函数#
mysql.Open 函数的返回值是 gorm.Dialector 对象。也就是说这里只是把相关的配置赋值给了 gorm.Dialector 接口类型,并没有实际的和数据库建立连接。如下是 mysql.Open 函数的实现:
func Open(dsn string) gorm.Dialector {
dsnConf, _ := mysql.ParseDSN(dsn)
return &Dialector{Config: &Config{DSN: dsn, DSNConfig: dsnConf}}
}
当然,其他数据库的 Open 函数也是类似,比如 clickhouse 数据库的 Open 函数实现如下:
func Open(dsn string) gorm.Dialector {
return &Dialector{Config: &Config{DSN: dsn}}
}
建立数据库连接:Dialector.Initialize#
在 gorm.Open 函数中,是通过 Dialector.Initialize 函数和数据库建立实际连接的。如下:
if config.Dialector != nil {
err = config.Dialector.Initialize(db)
}
Dialector 就是上文中提到的通过各个具体的数据库驱动的 Open 函数返回的接口类型。实际上也就是自己驱动下 Dialector 对象。然后在执行各自实例的 Initialize 函数,就能通过 dsn 中配置的地址和账号建立数据库连接了。
我们还是以 mysql 数据库为例,我们看下 Initialize 函数的核心实现:
本质上,在创建数据库连接的时候还是基于 golang 标准库的 database/sql 库实现的。最终,通过 gorm.Open 函数就初始化了一个数据库的连接
核心数据结构#
上文提到,通过 gorm.Open 函数会得到一个 gorm.DB 对象。该对象是 gorm 中的核心数据结构。如下是 gorm.DB 的结构体:
在 gorm.DB 结构中主要包含两个类型的字段:Config 和 Statement。
Config 结构体根据名字可知主要是一些和数据库相关的配置,比如和账号密码以及连接地址相关的 Dailector、数据库的连接 ConnPool,日志相关的等。
Statement 结构体,我们看到该结构体的主要由 Table、Model、Select、Schema 等组成,可想而知是跟具体的 sql 语句有关系的。
总结#
通过 gorm 建立数据库连接的时候,要依赖于具体连接哪种数据库,所以 gorm 项目下提供了多种数据库的驱动。这些数据库驱动遵守 gorm 提供的接口类型 Dailector 来创建连接。实际创建连接的函数是 Initialize 函数,并将创建好的连接返回给 gorm.DB.ConnPool 字段中。
特别说明:你的关注,是我写下去的最大动力。点击下方公众号卡片,直接关注。关注送《100 个 go 常见的错误》pdf 文档、经典 go 学习资料。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: