1. “github.com/jinzhu/gorm”
1.1 导入驱动
连接不同的数据库都需要导入对应数据的驱动程序,GORM已经贴心的为我们包装了一些驱动程序,只需要按如下方式导入需要的数据库驱动即可,每个DBMS(Database Manage System)都有各自的驱动程序。
注意,驱动要匿名
import _ "github.com/jinzhu/gorm/dialects/mysql"
// import _ "github.com/jinzhu/gorm/dialects/postgres"
// import _ "github.com/jinzhu/gorm/dialects/sqlite"
// import _ "github.com/jinzhu/gorm/dialects/mssql"
1.2 打开数据库
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
defer db.Close()
}
gorm.Open 是打开数据库的专用函数,有且仅有这一个。<br />第一个参数:<br />指定打开数据库的类型,MySQL就是"mysql"、PostgreSQL就是"postgres"、Sqlite3就是sqlite3<br />第二个参数:<br /> 写** DSN**(Date Source Name 数据源名称),每个DBMS要求的格式不一样,但都大同小异,以MySQL为例:
"user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
- user:操作数据库使用的用户名,在DBMS中可查出来,如果想要对数据库进行创建或更改,必须要使用拥有对应权限的用户
- password:连接数据库用户的的密码,在设置数据库创建用户的时候的会设置
- localhost:连接数据库时使用的主机(ip+数据库端口)
- dbname :数据库的名称
- ?之后的字符串固定就行
1.3 使用配置文件
db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
由于 gorm.Open 的入参传递了连接数据库的信息,较为复杂且不易更改,当更换信息时没有明了的入口,因此一般都是用配置文件来决定Open的入参。
思路很简单,就是把Open参数中各个有用的字段均用变量表示,然后这些变量的值就可以在其他的包中更改,以此来达到随时更改数据库连接信息的目的。
db,err = gorm.Open(utils.Db,fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
utils.DbUser,
utils.DbPassWord,
utils.DbHost,
utils.DbPort,
utils.DbName,
))
为此,我们需要三个文件,分别为:
- config.ini
- 该ini配置文件将给出连接数据库所需要的所有值,以供.go文件调用。
- setting.go
- 该文件将声明连接数据库所需要的全部变量,并调用config.ini来给他们赋值。
db.go
Db
- 即数据库类型,常用 mysql(注意要小写)
- DbHost
- 主机ip
- DbPort
- 数据库的端口。注意,这个由数据库决定,而不是程序员随意更改,mysql 数据库的默认端口为3306
- DbUser
- 使用数据库的用户,一定要选择有权限的用户,否则没什么意义
- DbPassWord
- 该用户操作数据库的密码
- DbName
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”) }
首先,使用 init 函数(执行在所有函数之前)来解析 config.ini 文件,使用方法 ini.Load("path")
```go
file,err := ini.Load("config/config.ini")
这样以来,file就是指向**指向一个ini文件的文件指针**,即 *ini.File 类型。然后就可用使用 file 绑定的方法来进行赋值,即 LoadData 中的所有方法:
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
func InitDb() {
// 连接数据库
db,err = gorm.Open(utils.Db,fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
utils.DbUser,
utils.DbPassWord,
utils.DbHost,
utils.DbPort,
utils.DbName,
))
if err != nil {
fmt.Println("数据库连接失败,请检查参数",err)
}
//禁止用默认表名的复数形式,如果置为true,则User的默认表名是"user",否则是"users"
db.SingularTable(true)
// AutoMigrate 用于自动迁移 schema
// AutoMigrate 会创建表、缺失的外键、约束、列和索引
db.AutoMigrate(&User{},&Article{},&Category{})
}
db.SingularTable 和 db.AutoMigrate 是和表的迁移有关,说白了就是创建表的相关操作,这个将单独列一章讲。
连接完成后,db 就是一个指向数据库的指针了,之后几乎所有对数据库的操作,用的都是 db 所绑定的方法了。
2. “gorm.io/gorm”
gorm 包进行了一次大的版本更新,新包名为 gorm.io/gorm。该包比 github.com/jinzhu/gorm 多了点东西,比如 Migratior 接口。连接数据库的操作也有所改变,但本质上不变
2.1 导入驱动
与github.com/jinzhu/gorm导入驱动不同,gorm.io/gorm 用了不一样的驱动包且不能匿名,因为要使用到其中的函数,以Mysql为例,导入驱动的包为:
import (
"gorm.io/driver/mysql" // 这个
"gorm.io/gorm"
)
2.2 打开数据库
与 github.com/jinzhu/gorm 不同,虽然 gorm.io/gorm 依然要使用 gorm.Open ,但是其参数已经不再是单纯的string类型了
因此需要用到驱动里的 Open 函数将 string 转换为 Dialector 。mysql.Open 的入参即DSN,这点和github.com/jinzhu/gorm 中的 DSN 格式完全一致:
dsn := "gin_blog:123456@(localhost:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
第二个参数就写 &gorm.Config{} 就行,不用管。