Leong's blog Leong's blog
首页
  • 编程
  • 资源
  • Golang
  • 微服务
  • vue
  • 操作系统
  • 数据结构与算法
  • Linux
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Leong Y

跑起来吧
首页
  • 编程
  • 资源
  • Golang
  • 微服务
  • vue
  • 操作系统
  • 数据结构与算法
  • Linux
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • go基础

  • go常用库

    • Socket编程
    • Gorm学习
      • 部署MySQL
      • 安装Gorm依赖
      • 连接数据库
      • Quick start
      • 创建表
      • 结构体定义
        • Gorm Tags
        • Gorm Model
      • CRUD
  • web开发

  • Golang
  • go常用库
leong
2024-07-08
目录

Gorm学习

# 部署MySQL

使用gorm之前我们要先准备mysql环境(已有mysql环境可以跳过这步)

Docker部署MySQL

# 安装Gorm依赖

go get -u github.com/jinzhu/gorm
1

# 连接数据库

连接不同的数据库都需要导入对应数据的驱动程序,GORM已经贴心的为我们包装了一些驱动程序,只需要按如下方式导入需要的数据库驱动即可:

import _ "github.com/jinzhu/gorm/dialects/mysql"
1

连接MySQL

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()
}
1
2
3
4
5
6
7
8
9

# Quick start

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

// User 用户信息
type User struct {
	ID        uint `gorm:"primaryKey"` // 设置主键
	Name      string
	Email     string `gorm:"uniqueIndex"` // 设置值唯一
	Age       int
	CreatedAt time.Time
	UpdatedAt time.Time
}

func main() {
	var (
		host     = "localhost"
		port     = 13306
		userName = "root"
		pwd      = "root123"
		dbName   = "mock"
	)

	link := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		userName,
		pwd,
		host,
		port,
		dbName,
	)
	db, err := gorm.Open("mysql", link)
	if err != nil {
		log.Fatal(err)
	}

	// 用完一定要记得关闭数据库连接
	defer db.Close()
	
	// 禁止复表(默认生成的表名尾巴带个s,需要设置禁止带s)
	db.SingularTable(true)

	// 自动迁移(用于自动创建或更新数据库表)
	db.AutoMigrate(&User{})

	user1 := User{Name: "John", Email: "john@example.com", Age: 25}
	user2 := User{Name: "Leong", Email: "leong@example.com", Age: 27}

	// 添加表记录
	if err := db.Create(&user1).Error; err != nil {
		log.Fatal(err)
	}

	if err := db.Create(&user2).Error; err != nil {
		log.Fatal(err)
	}

	/* 查询 */
	// 读取单条记录
	res1 := User{}

	if err := db.First(&res1).Error; err != nil {
		log.Fatal(err)
	}

	// {1 John john@example.com 25 }
	fmt.Println(res1)

	var res2 User
	// 条件查询单条记录
	if err := db.Find(&res2, "name = ?", "Leong").Error; err != nil {
		log.Fatal(err)
	}

	// {2 Leong leong@example.com 27 }
	fmt.Println(res2)

	// /* 更新 */
	if err := db.Model(&res2).Update("age", 18).Error; err != nil {
		log.Fatal(err)
	}

	// {2 Leong leong@example.com 18}
	fmt.Println(res2)

	// /* 删除 */
	if err := db.Delete(&res2).Error; err != nil {
		log.Fatal(err)
	}
}

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

# 创建表

AutoMigrate

db.AutoMigrate(&User{})
1

自动迁移:

  • 如果表不存在,则创建表
  • 如果表存在,则检查表结构,并添加新的列或索引,以匹配模型定义
  • 自动添加或更新外键约束

CreateTable

db.CreateTable(&User{})
1

表创建:

  • 仅创建表,不会影响已有的表结构

总结:

  1. 开发阶段:
    • 使用 AutoMigrate 更为方便和高效,能够快速响应模型结构的变化,适合快速迭代开发。
  2. 生产环境:
    • 使用 CreateTable 以及配合手写迁移脚本或专门的迁移工具(如 Golang Migrate)。这种方式更为稳定,能够精细控制数据库的变化,适合严格控制数据库结构变化的生产环境。

# 结构体定义

让我们来重新看一下quick start中的结构体定义

type User struct {
	ID        uint   `gorm:"primaryKey"`          // 设置主键
	Name      string `gorm:"column:normal_name"`  // 自定义列名
	Email     string `gorm:"uniqueIndex"`         // 设置值唯一
	Age       int
	CreatedAt time.Time
	UpdatedAt time.Time
}
1
2
3
4
5
6
7
8

# Gorm Tags

可以发现ID以及Email等字段带了结构体标记(tags),使用结构体声明模型时,标记(tags)是可选项。gorm支持以下标记:

结构体标记(Tag) 描述
Column 指明列名
Type 指定列数据类型
Size 指定列大小, 默认值255
PRIMARY_KEY 将列指定为主键
UNIQUE 将列指定为唯一
DEFAULT 指定列默认值
PRECISION 指定列精度
NOT NULL 将列指定为非 NULL
AUTO_INCREMENT 指定列是否为自增类型
INDEX 创建具有或不带名称的索引, 如果多个索引同名则创建复合索引
UNIQUE_INDEX 和 INDEX 类似,只不过创建的是唯一索引
EMBEDDED 将结构设置为嵌入
EMBEDDED_PREFIX 设置嵌入结构的前缀
- 忽略此字段

关联相关标记(tags)

结构体标记(Tag) 描述
MANY2MANY 指定连接表
FOREIGNKEY 设置外键
ASSOCIATION_FOREIGNKEY 设置关联外键
POLYMORPHIC 指定多态类型
POLYMORPHIC_VALUE 指定多态值
JOINTABLE_FOREIGNKEY 指定连接表的外键
ASSOCIATION_JOINTABLE_FOREIGNKEY 指定连接表的关联外键
SAVE_ASSOCIATIONS 是否自动完成 save 的相关操作
ASSOCIATION_AUTOUPDATE 是否自动完成 update 的相关操作
ASSOCIATION_AUTOCREATE 是否自动完成 create 的相关操作
ASSOCIATION_SAVE_REFERENCE 是否自动完成引用的 save 的相关操作
PRELOAD 是否自动完成预加载的相关操作

# Gorm Model

上面的结构体我们也可以换种写法,加上gorm.Model

type User struct {
	gorm.Model
	Name  string
	Email string `gorm:"uniqueIndex"` // 设置值唯一
	Age   int
}
1
2
3
4
5
6

为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体。

gorm.Model

type Model struct {
	ID        uint `gorm:"primary_key"`
	CreatedAt time.Time
	UpdatedAt time.Time
	DeletedAt *time.Time `sql:"index"`
}
1
2
3
4
5
6

PS:

  • CreatedAt字段的值将会自动赋值上初次创建记录的时间
  • UpdatedAt字段值将会是每次记录更改的时间

# CRUD

常用的crud可以参考李文周大佬的博客以及官方文档

GORM CRUD指南 | 李文周的博客 (opens new window)

GORM 指南 (opens new window)

上次更新: 2024/07/08, 18:19:51
Socket编程
gin使用笔记

← Socket编程 gin使用笔记→

最近更新
01
vue3快速上手
07-31
02
程序从加载到运行的过程
07-08
03
进程、线程、协程
07-08
更多文章>
Theme by Vdoing | Copyright © 2023-2024 Leong Y | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式