本文介绍go语言中gorm框架对mysql数据库的管理,并将其按照项目开发把初始化和关闭数据库连接进行全局封装。以user.go为例
目录结构
- |——db
- | |_ db.go //管理数据库连接
- |——controller
- | |_ user.go //调用数据库操作
- |__ main.go
mysql
安装mysql包,包括原生gorm包和改进包,二选一即可
go get gorm.io/gorm
go get github.com/jinzhu/gorm
db.go
引入gorm框架和mysql包
package db
import (
"github.com/jinzhu/gorm"
_ "gorm.io/driver/mysql"
"log"
)
创建全局变量,方便不同controller的方法中调用
var DB *gorm.DB
创建数据库连接方法: 设置数据库DSN(数据来源名称),并利用gorm进行连接 dns中同时可以对数据库连接相关参数进行配置 连接完成后对结构体向数据库进行迁移。经过实践,只能将调用AutoMigrate方法的代码放在InitDB方法中,不能独立出方法如db.DB.InitDB();db.DB.Migrate()(其中包含各种结构体的迁移),否则将报错。
func InitDB() {
connect := "root:123456@tcp(localhost:3306)/gorm?charset=utf8&parseTime=True&loc=Local"
db, err := gorm.Open("mysql", connect)
if err != nil {
log.Fatal(err)
}
DB = db
DB.AutoMigrate(&model.User{})
}
数据库表进行迁移时,若数据库中不存在该表则会自动生成与实体类对应表 以以下User结构体为例
type User struct {
Id int64 `json:"id,omitempty"` //唯一序号字段
Username string `json:"username,omitempty"` //用户名(唯一)
Name string `json:"name,omitempty"` //用户昵称
FollowCount int64 `json:"follow_count,omitempty"`
FollowerCount int64 `json:"follower_count,omitempty"`
IsFollow bool `json:"is_follow,omitempty"`
Password string `json:"password,omitempty"` //密码
}
在数据库dsn配置中未启用SingularTable(单数表名)配置时,数据库表名为users(即结构体名+s) 数据库字段名为json序列化名。 且注意结构体开放给其他包使用时,结构体名开头大写,且属性名也需要大写才能映射到。相当于首字母大写为公有属性,首字母小写为私有属性
创建数据库关闭连接方法
func CloseDB() {
err := DB.Close()
if err != nil {
log.Fatal(err)
}
}
main.go
main.go中导入db包,且main方法中调用管理数据库的方法,实现连接数据库操作
db.InitDB()
defer db.CloseDB()
user.go
调用db.DB全局变量可以对数据库进行操作,例如增删改查
newUser := model.User{Username: username, Name: username, Password: password}
db.DB.Create(&newUser)
db.DB.Last(&newUser)
db.DB.First(&neUuser)
db.DB.Take(&newUser)
user := model.User{}
res := db.DB.Where("username = ?", username).Where("password=?", password).First(&user)
可以直接对实体类变量进行读写
- Create:插入该实体类映射的记录。
- db.Create 函数会返回如下 3 个值:
- user.ID:返回插入数据的主键,这个是直接赋值给 user 变量。
- result.Error:返回 error。
- First:获取第一条记录(主键)
- Last:获取最后一条记录(主键)
- Take:获取一条记录,没有指定排序字段
- where:条件查询 同时也可以使用链式编程简化代码量,如最后一行的where().where().First 在条件查询中First查询出符合条件的一条记录,Find为多条记录