不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • GO基础

  • 面向对象

  • 并发编程

  • 常用库

  • 数据库操作

    • GORM

    • sqlx

    • database-sql

    • GORMv2

      • 01.GORM入门
        • 01.GORM入门
          • 1.1 什么是orm
          • 1.2 什么是GORM
        • 02.GORMv3基本使用
          • 2.1 安装
          • 2、连接MySQL
          • 2.3 自动创建表
          • 2.4 基本增删改查
        • 03.模型定义
          • 3.1 模型定义
          • 3.2 支持结构标签
      • 02.CRUD接口
      • 03.关联
      • 04.其他
    • go-redis

    • redigo

    • elastic

  • Beego框架

  • Beego商城

  • GIN框架

  • GIN论坛

  • 微服务

  • 设计模式

  • Go
  • 数据库操作
  • GORMv2
xiaonaiqiang
2022-04-01
目录

01.GORM入门

# 01.GORM入门

# 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回调编写可扩展插件
  • 全特性测试覆盖
  • 开发者友好

# 02.GORMv3基本使用

# 2.1 安装

go get -u gorm.io/gorm
1

# 2、连接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
18
  • 创建mysql连接
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
17

# 2.3 自动创建表

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

# 2.4 基本增删改查

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

# 03.模型定义

详情官网 (opens new window)

# 3.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

# 3.2 支持结构标签

  • 标签是声明模型时可选的标记
标签 说明
Column 指定列的名称
Type 指定列的类型
Size 指定列的大小,默认是 255
PRIMARY_KEY 指定一个列作为主键
UNIQUE 指定一个唯一的列
DEFAULT 指定一个列的默认值
PRECISION 指定列的数据的精度
NOT NULL 指定列的数据不为空
AUTO_INCREMENT 指定一个列的数据是否自增
INDEX 创建带或不带名称的索引,同名创建复合索引
UNIQUE_INDEX 类似 索引,创建一个唯一的索引
EMBEDDED 将 struct 设置为 embedded
EMBEDDED_PREFIX 设置嵌入式结构的前缀名称
- 忽略这些字段
上次更新: 2024/3/13 15:35:10
01.database/sql
02.CRUD接口

← 01.database/sql 02.CRUD接口→

最近更新
01
300.整体设计
06-10
02
06.LangGraph
06-09
03
202.AI销售智能体
06-07
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式