运维八一 运维八一
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)

运维八一

运维,运维!
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)
  • Go

    • 前言

    • Go基础知识

    • Go基本语法

    • 实战项目:简单web服务

    • 基本数据类型

    • 内置运算符

    • 分支和循环

    • 函数 function

    • 结构体 struct

    • 方法 method

    • 实战项目:跟踪函数调用链

    • 接口 interface

    • 并发 concurrency

    • 指针

    • 实战项目:实现轻量级线程池

    • 实战项目:实现TCP服务器

    • go常用包

    • Gin框架

      • gin入门
      • gin工作流程
      • gin中间件
      • gin路由
      • gin请求
      • 数据绑定和校验
      • 响应返回
      • 路由分发
      • Cookie和Session
      • gin项目结构
      • GORM入门
        • 1.1 什么是ORM?
        • 1.2 什么是GORM?
        • 1.3 GORM(v3)基本使用
        • 1.4 模型定义
          • 1.4.1 模型定义
          • 1.4.2 支持结构标签
      • 一对多关联查询
    • go随记

  • Python

  • Shell

  • Java

  • Vue

  • 前端

  • 编程浅尝
  • Go
  • Gin框架
lyndon
2022-06-27
目录

GORM入门

学习方法(3w1h)

  • 第一步:先到百度搜索几篇基本的用法案例,粘贴过来测试一下(基本了解)
  • 第二步:到官方系统的整理(最好整理成博客)只能学会语法
  • 第三步:如何融入到项目中( GitHub、gitee ),开源项目( 抄 ) 40K+
  • 第四步:读源码和实现原理( 面试为什么问底层? )

# 1.1 什么是ORM?

orm是一种术语而不是软件

  • 1)orm英文全称object relational mapping,就是 ==对象映射关系== 程序;
  • 2)简单来说类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的;
  • 3)为了保证一致的使用习惯,通过 orm将编程语言的对象模型和数据库的关系模型建立映射关系;
  • 4)这样我们直接 使用编程语言的对象模型进行操作数据库 就可以了,而不用直接使用sql语言;

# 1.2 什么是GORM?

文档参考 (opens new window)

GORM是一个神奇的,对开发人员友好的 Golang ORM 库。

  • 全特性 ORM (几乎包含所有特性)
  • 模型关联 (一对一, 一对多,一对多 (反向), 多对多, 多态关联)
  • 钩子 (Before/After Create/Save/Update/Delete/Find)
  • 预加载
  • 事务
  • 复合主键
  • SQL 构造器
  • 自动迁移
  • 日志
  • 基于GORM回调编写可扩展插件
  • 全特性测试覆盖
  • 开发者友好

# 1.3 GORM(v3)基本使用

安装

go get -u gorm.io/gorm
1

连接MySQL

# 创建一个数据库
mysql>  create database test_db charset utf8;  # 创建数据库
mysql>  use test_db;               # 切换到数据库
mysql>  show tables;               # 查看是否生成表
+-------------------+
| Tables_in_test_db |
+-------------------+
| users       |
+-------------------+
mysql> desc users;                # 查看表的字段是否正常
+----------+------------+------+-----+---------+----------------+
| Field  | Type    | Null | Key | Default | Extra     |
+----------+------------+------+-----+---------+----------------+
| id    | bigint(20) | NO  | PRI | NULL  | auto_increment |
| username | longtext  | YES |   | NULL  |        |
| password | longtext  | YES |   | NULL  |        |
+----------+------------+------+-----+---------+----------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

创建mysql连接

参考文档 (opens new window)

package main
import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
	charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(db)  // &{0xc00018a630 <nil> 0 0xc000198380 1}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

自动创建表

package main
import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// User 表的结构体ORM映射
type User struct {
	Id    int64 `gorm:"primary_key" json:"id"`
	Username  string
	Password  string
}

func main() {
	// 1、连接数据库
	dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
	charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	
	// 2、自动创建表
	db.AutoMigrate(
	User{},
	)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

基本增删改查

package main
import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// User 表的结构体ORM映射
type User struct {
	Id    int64 `gorm:"primary_key" json:"id"`
	Username string
	Password string
}

func main() {
	// 0、连接数据库
	dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
	charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	db.AutoMigrate(User{})

    // 1、增
	db.Create(&User{
		//Id:    3,
		Username: "zhangsan",
		Password: "123456",
	})
    
	// 2、改
	db.Model(User{
		Id: 3,
	}).Update("username", "lisi")
	
    // 3、查
	// 3.1 过滤查询
	u := User{Id: 3}
	db.First(&u)
	fmt.Println(u)
    
	// 3.2 查询所有数据
	users := []User{}
	db.Find(&users)
	fmt.Println(users)  // [{2 zhangsan 123456} {3 lisi 123456}]
	
    // 4、删
	// 4.1 删除 id = 3 的用户
	db.Delete(&User{Id: 3})
	
    // 4.2 条件删除
	db.Where("username = ?", "zhangsan").Delete(&User{})
}
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

# 1.4 模型定义

文档参考 (opens new window)

# 1.4.1 模型定义

模型一般都是普通的 Golang 的结构体,Go的基本数据类型,或者指针。

type User struct {
	Id      int64    `gorm:"primary_key" json:"id"`
	Name     string
	CreatedAt   *time.Time  `json:"createdAt" gorm:"column:create_at"`
	Email     string   `gorm:"type:varchar(100);unique_index"`   // 唯一索引
	Role     string   `gorm:"size:255"`  //设置字段的大小为255个字节
	MemberNumber  *string   `gorm:"unique;not null"`  // 设置字段唯一且不为空
	memberNumber 
	Num      int    `gorm:"AUTO_INCREMENT"`    // 设置 Num字段自增
	Address    string   `gorm:"index:addr"`  // 给Address 创建一个名字是 `addr`的索引
	IgnoreMe   int     `gorm:"-"`      //忽略这个字段
}
1
2
3
4
5
6
7
8
9
10
11
12

image-20220710235706003

# 1.4.2 支持结构标签

标签是声明模型时可选的标记。

标签 说明
Column 指定列的名称
Type 指定列的类型
Size 指定列的大小,默认是 255
PRIMARY_KEY 指定一个列作为主键
UNIQUE 指定一个唯一的列
DEFAULT 指定一个列的默认值
PRECISION 指定列的数据的精度
NOT NULL 指定列的数据不为空
AUTO_INCREMENT 指定一个列的数据是否自增
INDEX 创建带或不带名称的索引,同名创建复合索引
UNIQUE_INDEX 类似 索引 ,创建一个唯一的索引
EMBEDDED 将 struct 设置为 embedded
EMBEDDED_PREFIX 设置嵌入式结构的前缀名称
- 忽略这些字段
上次更新: 2022/07/11, 00:22:51
gin项目结构
一对多关联查询

← gin项目结构 一对多关联查询→

最近更新
01
ctr和crictl显示镜像不一致
03-13
02
alpine镜像集成常用数据库客户端
03-13
03
create-cluster
02-26
更多文章>
Theme by Vdoing | Copyright © 2015-2024 op81.com
苏ICP备18041258号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式