学习gorm系列九:gorm中如何使用枚举值

GORM中的枚举介绍

GORM是一个流行的Go ORM,它允许我们定义结构体来表示数据库表,并提供一个接口来执行CRUD操作。枚举在编程中是一个有用的特性,它允许我们定义一个变量可以取的固定值集。在这篇文章中,我们将探索如何向GORM模型添加枚举。

第一步:定义枚举

首先,我们需要定义枚举值的类型。在Go中,我们可以用string类型来定义枚举。如下:

go 复制代码
type Status string

const (
    Pending Status = "pending"
    Approved Status = "approved"
    Rejected Status = "rejected"
)

在该示例中,我们定义了枚举类型Status,该类型有3个枚举值:"pending","approved", "rejectd"。

第二步:定义模型

其次,我们需要定义一个gorm模型来使用该枚举类型。如下:

go 复制代码
type User struct {
    ID        uint   `gorm:"primary_key"`
    Name      string
    Status    Status
    CreatedAt time.Time
    UpdatedAt time.Time
}

在该示例中,User模型中有一个枚举类型Status的字段。

第三步:在gorm操作中使用枚举

在定义了枚举类型和gorm模型后,我们就可以在gorm的操作中使用枚举类型了。如下:

go 复制代码
// 创建一个状态为pending的user实例
user := User{Name: "John", Status: Pending}
db.Create(&user)

// 查询状态为approved的所有用户
var users []User
db.Where("status = ?", Approved).Find(&users)

// 把一个用户的状态更新成rejected
db.Model(&user).Update("status", Rejected)

// 删除状态为pending的所有用户
db.Where("status = ?", Pending).Delete(User{})

在上面的示例中,我们在gorm的创建、查询、更新和删除操作中都使用到了Status的枚举类型。

那么,我们看看在go中有哪些常见的定义枚举的方法。

方法一:使用字符串类型

在模型中,我们可以是通过使用字符串类型来替代枚举类型。如下:

go 复制代码
type User struct {
  ID   uint
  Role string
}

在该示例中,我们可以使用Role这个字符串类型来表示不同的用户角色,比如"admin","moderator"以及"user"等等。

但这种方式也有缺点,比如容易出现拼写错误,没有类型的约束。

方法二:自定义类型

另外一种替代枚举类型的方法是通过自定义类型来代表枚举值。如下:

go 复制代码
type Role string

const (
  Admin     Role = "admin"
  Moderator Role = "moderator"
  User      Role = "user"
)

type User struct {
  ID   uint
  Role Role
}

在这个示例中,Role类型被定义成了字符串的别名。然后,不同的角色值以常量的形式定义。最后,在User模型中的Role字段中使用了Role类型。

这种方法的优点是可以做编译时检查,因此不容易出现拼写错误。同时,该种方法还将值限制在了Role类型下。

方法三:使用GORM提供的枚举类进

Gorm提供了内建的枚举类型。如下:

go 复制代码
type Role string

const (
  Admin     Role = "admin"
  Moderator Role = "moderator"
  User      Role = "user"
)

type User struct {
  ID   uint
  Role Role `gorm:"type:enum('admin', 'moderator', 'user')"`
}

在该示例中,Role类型被定义成string类型的别名成为一个新的类型,同时Role的值通过常量定义。在User的模型中,又通过gorm的标签来限制了该字段值的范围。

这种方法和方法二中的方式具有相同的优点,同时该方法还能让通过gorm创建数据表时,让数据表的字段也是enum类型的优点。

结论

在本文中,我们探讨了如何在Go中给GORM模型添加枚举类型。枚举是一个有用的功能,它允许我们定义变量可以取的一组固定值。通过在GORM模型中使用枚举,我们可以提高代码的类型安全性,使数据库操作更加可靠。

**特别说明:**你的关注,是我写下去的最大动力。关注Go学堂 ,送《100个go常见的错误》pdf文档、经典go学习资料。

相关推荐
蛋先生DX10 分钟前
Java和Go都拍胸脯说"内存我包了",可它们到底是怎么下手的?
java·go·编程语言
pe7er11 分钟前
引子
前端·后端·架构
SimonKing12 分钟前
阅后即焚的加密便签:Cryptgeon,你口袋里的秘密信使
java·后端·程序员
灯澜忆梦13 分钟前
【Redis中间件】#2 | 基础数据类型语法
redis·后端
孙启超16 分钟前
【AI开发之Rust】第 6 课:结构体、枚举与方法 —— 开始定义自己的类型
开发语言·人工智能·后端·ai·rust
小蒜学长21 分钟前
基于Python的微博热搜话题可视化分析系统的设计与实现(代码+数据库+LW)
后端·python·django·数据可视化·情感分析·微博热搜
BingoGo23 分钟前
Whim 是什么?一门把 PHP 被否决的设想真跑起来的实验语言
后端·php
IT_陈寒42 分钟前
Java序列化坑了我三天,原来问题出在这个默认方法
前端·人工智能·后端
一条泥憨鱼1 小时前
苍穹外卖【day10| 来电提醒和客户催单】
java·后端·websocket·苍穹外卖
ly76891 小时前
Spring Boot 3.2 虚拟线程在 Web 层与 JDBC 池的实践边界
前端·spring boot·后端·tomcat·jdbc·虚拟线程