学习gorm系列:创建数据库连接

数据库 其他数据库
通过gorm建立数据库连接的时候,要依赖于具体连接哪种数据库,所以gorm项目下提供了多种数据库的驱动。这些数据库驱动遵守gorm提供的接口类型Dailector来创建连接。

大家好,我是渔夫子。

所以本系列文章意在深入的学习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等常用的数据库的驱动库。地址是:https://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接口。

图片图片

image.png

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字段中。

责任编辑:武晓燕 来源: Go学堂
相关推荐

2023-10-08 08:11:54

2023-11-07 00:00:00

Dialector参数接口

2023-11-02 10:32:27

GoGORM

2009-12-28 10:09:10

ADO.NET连接

2009-12-24 15:11:47

ADO.NET数据库连

2009-12-22 13:34:48

ADO.Net Tea

2011-06-27 12:56:28

2023-11-02 08:56:59

ORMGORM

2010-03-18 14:39:55

Python数据库连接

2021-09-06 10:24:12

鸿蒙HarmonyOS应用

2023-08-29 07:35:15

2009-12-31 10:38:10

ADO.NET连接数据

2009-11-12 11:23:35

ADO.NET SQL

2009-04-20 14:29:41

Oracle连接创建连接

2023-12-20 12:49:05

索引数据检索数据库

2011-05-26 15:03:47

catalog数据库

2020-09-22 15:56:31

Java

2009-09-25 13:18:15

Hibernate数据

2011-05-26 13:42:50

MFC连接MySql数据库

2021-09-03 15:41:00

鸿蒙HarmonyOS应用
点赞
收藏

51CTO技术栈公众号