1. “github.com/jinzhu/gorm”

1.1 导入驱动

连接不同的数据库都需要导入对应数据的驱动程序,GORM已经贴心的为我们包装了一些驱动程序,只需要按如下方式导入需要的数据库驱动即可,每个DBMS(Database Manage System)都有各自的驱动程序。
注意,驱动要匿名

  1. import _ "github.com/jinzhu/gorm/dialects/mysql"
  2. // import _ "github.com/jinzhu/gorm/dialects/postgres"
  3. // import _ "github.com/jinzhu/gorm/dialects/sqlite"
  4. // import _ "github.com/jinzhu/gorm/dialects/mssql"

1.2 打开数据库

  1. import (
  2. "github.com/jinzhu/gorm"
  3. _ "github.com/jinzhu/gorm/dialects/mysql"
  4. )
  5. func main() {
  6. db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
  7. defer db.Close()
  8. }
  1. gorm.Open 是打开数据库的专用函数,有且仅有这一个。<br />第一个参数:<br />指定打开数据库的类型,MySQL就是"mysql"PostgreSQL就是"postgres"Sqlite3就是sqlite3<br />第二个参数:<br /> 写** DSN**(Date Source Name 数据源名称),每个DBMS要求的格式不一样,但都大同小异,以MySQL为例:
  1. "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  • user:操作数据库使用的用户名,在DBMS中可查出来,如果想要对数据库进行创建或更改,必须要使用拥有对应权限的用户

image.png

  • password:连接数据库用户的的密码,在设置数据库创建用户的时候的会设置
  • localhost:连接数据库时使用的主机(ip+数据库端口)
  • dbname :数据库的名称

image.png

  • ?之后的字符串固定就行

1.3 使用配置文件

  1. db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")

由于 gorm.Open 的入参传递了连接数据库的信息,较为复杂且不易更改,当更换信息时没有明了的入口,因此一般都是用配置文件来决定Open的入参。
思路很简单,就是把Open参数中各个有用的字段均用变量表示,然后这些变量的值就可以在其他的包中更改,以此来达到随时更改数据库连接信息的目的。

  1. db,err = gorm.Open(utils.Db,fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
  2. utils.DbUser,
  3. utils.DbPassWord,
  4. utils.DbHost,
  5. utils.DbPort,
  6. utils.DbName,
  7. ))

为此,我们需要三个文件,分别为:

  • config.ini
    • 该ini配置文件将给出连接数据库所需要的所有值,以供.go文件调用。
  • setting.go
    • 该文件将声明连接数据库所需要的全部变量,并调用config.ini来给他们赋值。
  • db.go

    • 调用setting.go文件中的变量来连接数据库。

      1.3.1 config.ini

      ini文件中的每一块都被称作一个section,每一section将写入一部分内容的信息,每个信息都是 key-value 的形式,如下所示:
      image.png
      其中,[server] 是开启服务的有关参数,[qiniu] 是连接七牛云服务器的有关参数,和数据库没关系,这里挂这张图只是说明一下,ini文件用section分隔数据类别的机制。
      如果只是配置数据库信息,用[database]就行了。其中需要有5个参数
  • Db

    • 即数据库类型,常用 mysql(注意要小写
  • DbHost
    • 主机ip
  • DbPort
    • 数据库的端口。注意,这个由数据库决定,而不是程序员随意更改,mysql 数据库的默认端口为3306
  • DbUser
    • 使用数据库的用户,一定要选择有权限的用户,否则没什么意义
  • DbPassWord
    • 该用户操作数据库的密码
  • DbName
    • 数据库的名称,即在连接前,首先要建立一个相关数据库image.png

      1.3.2 setting.go

      该文件将声明数据库配置需要用到的变量(当然是全局变量),然后调用 config.ini 中的参数进行赋值: ```go package utils

import ( “fmt” “gopkg.in/ini.v1” )

var ( // [database] Db string DbHost string DbPort string DbUser string DbPassWord string DbName string )

// init 运行在所有函数前,包括main func init(){ file,err := ini.Load(“config/config.ini”) if err != nil { fmt.Println(“配置文件读取错误,请检查文件路径”) } LoadData(file) }

func LoadData(file *ini.File){ // 调用file的database部分下AppMode对应的值,如果没有则用默认值Mysql Db = file.Section(“database”).Key(“Db”).MustString(“mysql”) DbHost = file.Section(“database”).Key(“DbHost”).MustString(“localhost”) DbPort = file.Section(“database”).Key(“DbPort”).MustString(“3306”) DbUser = file.Section(“database”).Key(“DbUser”).MustString(“gin_blog”) DbPassWord = file.Section(“database”).Key(“DbPassWord”).MustString(“admin123”) DbName = file.Section(“database”).Key(“DbName”).MustString(“gin_blog”) }

  1. 首先,使用 init 函数(执行在所有函数之前)来解析 config.ini 文件,使用方法 ini.Load("path")
  2. ```go
  3. file,err := ini.Load("config/config.ini")
  1. 这样以来,file就是指向**指向一个ini文件的文件指针**,即 *ini.File 类型。然后就可用使用 file 绑定的方法来进行赋值,即 LoadData 中的所有方法:
  1. Db = file.Section("database").Key("Db").MustString("mysql")

第一个参数为要使用的section,第二个参数为config.ini文件中被调用参数的key,第三个参数为给变量设置的默认值。上述代码执行后的结构等价于:Db = “mysql”

1.3.3 db.go

该文件为连接数据库的最后一步,调用 setting.go 中的各个全局变量来完成 gorm.Open。要注意的是,第二个数需要用到函数:fmt.Sprintf

  1. func InitDb() {
  2. // 连接数据库
  3. db,err = gorm.Open(utils.Db,fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
  4. utils.DbUser,
  5. utils.DbPassWord,
  6. utils.DbHost,
  7. utils.DbPort,
  8. utils.DbName,
  9. ))
  10. if err != nil {
  11. fmt.Println("数据库连接失败,请检查参数",err)
  12. }
  13. //禁止用默认表名的复数形式,如果置为true,则User的默认表名是"user",否则是"users"
  14. db.SingularTable(true)
  15. // AutoMigrate 用于自动迁移 schema
  16. // AutoMigrate 会创建表、缺失的外键、约束、列和索引
  17. db.AutoMigrate(&User{},&Article{},&Category{})
  18. }

db.SingularTable 和 db.AutoMigrate 是和表的迁移有关,说白了就是创建表的相关操作,这个将单独列一章讲。
连接完成后,db 就是一个指向数据库的指针了,之后几乎所有对数据库的操作,用的都是 db 所绑定的方法了。
image.png

2. “gorm.io/gorm”

gorm 包进行了一次大的版本更新,新包名为 gorm.io/gorm。该包比 github.com/jinzhu/gorm 多了点东西,比如 Migratior 接口。连接数据库的操作也有所改变,但本质上不变
image.png

2.1 导入驱动

与github.com/jinzhu/gorm导入驱动不同,gorm.io/gorm 用了不一样的驱动包且不能匿名,因为要使用到其中的函数,以Mysql为例,导入驱动的包为:

  1. import (
  2. "gorm.io/driver/mysql" // 这个
  3. "gorm.io/gorm"
  4. )

2.2 打开数据库

与 github.com/jinzhu/gorm 不同,虽然 gorm.io/gorm 依然要使用 gorm.Open ,但是其参数已经不再是单纯的string类型了
image.png
因此需要用到驱动里的 Open 函数将 string 转换为 Dialector 。mysql.Open 的入参即DSN,这点和github.com/jinzhu/gorm 中的 DSN 格式完全一致:

  1. dsn := "gin_blog:123456@(localhost:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
  2. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

第二个参数就写 &gorm.Config{} 就行,不用管。