12.GORM操作
# 01.GORM介绍
# 1.1 GORM是什么
GORM 是 golang 的一个 orm 框架,它是一个单独的 ORM 框架。
相比 beego 自带的 orm 框架,语法要更友好一些,关联查询更简单、功能更强大一些。
简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术
是"对象-关系 映射"(Object/Relational Mapping) 的缩写
# 1.2 GORM功能介绍
全功能 ORM (无限接近)
关联 (Has One, Has Many, Belongs To, Many To Many, 多态)
钩子 (在创建/保存/更新/删除/查找之前或之后)
预加载
事务
复合主键
SQL 生成器
数据库自动迁移
自定义日志
可扩展性, 可基于 GORM 回调编写插件
所有功能都被测试覆盖
开发者友好
# 1.3 创建一个项目
bee new beegogorm
go mod init beegogorm
go build -mod=mod
1
2
3
2
3
# 02.GORM基本使用
# 2.1 安装gorm
go get -u github.com/jinzhu/gorm
1
# 2.2 建立数据库链接
models/core.go
package models
import (
"github.com/astaxie/beego"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
var DB *gorm.DB
var err error
func init() {
//和数据库建立连接
DB, err = gorm.Open("mysql", "root:123456@/beego?charset=utf8&parseTime=True&loc=Local")
if err != nil {
beego.Error()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2.3 关闭数据库链接
package main
import (
"beegogorm/models"
_ "beegogorm/routers"
"github.com/astaxie/beego"
)
func main() {
beego.Run()
defer models.DB.Close() //关闭数据库连接
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 2.4 定义数据库模型
models/user.go
package models
type User struct {
Id int
Username string
Age int
Email string
AddTime int
}
//定义结构体操作的数据库表
func (User) TableName() string {
return "user"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.5 自动创建表
- 注意:GORM 的AutoMigrate函数,仅支持建表,不支持修改字段和删除字段,避免意外导致丢失数据。
- GORM更多用法 (opens new window)
func init() {
//和数据库建立连接
DB, err = gorm.Open("mysql", "root:chnsys@2016@/beegodb?charset=utf8&parseTime=True&loc=Local")
if err != nil {
beego.Error()
}
if !DB.HasTable(&User{}){
// 创建表
DB.CreateTable(&User{}) // 根据User结构体建表
DB.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{}) // 设置表结构的存储引擎为InnoDB
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 03.GORM增删改查
# 3.1 基本增删改查
controllers/user.go
package controllers
import (
"beegogorm/models"
"github.com/astaxie/beego"
"time"
)
type UserController struct {
beego.Controller
}
func (c *UserController) UserAdd() { // 1.增
user := models.User{
Username: "zhangsan",
Age: 26,
Email: "zhangsan.qq.com",
AddTime: int(time.Now().Unix()),
}
models.DB.Create(&user)
c.Ctx.WriteString("增加数据成功")
}
func (c *UserController) UserDelete() { // 2.删
user := models.User{Id: 1}
models.DB.Delete(&user)
c.Ctx.WriteString("删除数据成功")
}
func (c *UserController) UserEdit() { // 3.改
//1、查找id=5的数据
user := models.User{Id: 5}
//models.DB.First(&user)
//2、执行修改
user.Username = "王五"
models.DB.Save(&user)
c.Ctx.WriteString("修改数据成功")
}
func (c *UserController) UserSelect() { // 4.查
//1、查询一条数据
// user := models.User{Username: "lisi"}
// models.DB.Find(&user)
//2、查询所有数据
user := []models.User{}
models.DB.Find(&user)
c.Data["json"] = user
c.ServeJSON()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 3.2 定义路由
package routers
import (
"beegogorm/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/user/add/", &controllers.UserController{},"get:UserAdd")
beego.Router("/user/delete/", &controllers.UserController{},"get:UserDelete")
beego.Router("/user/edit/", &controllers.UserController{},"get:UserEdit")
beego.Router("/user/select/", &controllers.UserController{},"get:UserSelect")
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
上次更新: 2024/3/13 15:35:10