Redian新闻
>
gorm中如何使用枚举值

gorm中如何使用枚举值

公众号新闻


GORM中的枚举介绍

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

第一步:定义枚举

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

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

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

第二步:定义模型

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

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

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

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

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


user := User{Name: "John", Status: Pending}db.Create(&user)

var users []Userdb.Where("status = ?", Approved).Find(&users)

db.Model(&user).Update("status", Rejected)

db.Where("status = ?", Pending).Delete(User{})

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

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

方法一:使用字符串类型

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

type User struct {  ID   uint  Role string}

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

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

方法二:自定义类型

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

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提供了内建的枚举类型。如下:

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模型中使用枚举,我们可以提高代码的类型安全性,使数据库操作更加可靠。

链接:https://juejin.cn/post/7306151837965631526

(版权归原作者所有,侵删)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
TscanPlus v1.2 发布 | 新增域名枚举等功能NeurIPS 2023 | 结合脉冲神经网络和Transformer的纯加法Transformer系统化掌握Armv8/Armv9架构策略 + 枚举 优雅的消灭 if-else想象才是皇帝新衣之精要Go操作数据库与Gorm讲解不想知道谁对谁错比尔·盖茨重磅发文:AI将彻底改变你如何使用电脑,还将颠覆软件行业如何使用 VLC 录制屏幕 | Linux 中国饭局中如果你不是主角,就不要去管这5件闲事【赠送GPT账号】如何使用ChatGPT完成科研、程序开发、论文写作等,看看这篇!我在Performer中发现了Transformer-VQ的踪迹研究人员如何使用Nvidia的GPU模拟Qubits不会面试提问?在面试中如何向面试官提问不会出错如何使用华夫饼机不规范的枚举类代码引发的一场事故11月必看!“新世界三大男高音”Juan Diego Flórez首次亮相澳洲!合法吗?多伦多湖景床月租$900!共用一张1.5m中号床14岁女生航班飞行途中如厕,被男空乘偷拍...NeurIPS 2023 | MCUFormer: 可在内存有限微控制器上部署的Vison Transformer模型GPT、Etsy又在大面积封号!在国内如何使用美国电话?一招搞定Eye on China Market, Top Pharma Firms Showcase Rare Disease Care如何使用万用表起底PC新机皇:高通4nm芯片,Arm架构Windows系统,内置Transformer加速,还配了5G和WiFi7一文论重复性工作中如何培养匠心到伦敦逛大英博物馆NeurIPS 2023 | MixFormerV2:基于Transformer的高效跟踪器《寄生虫》中如何构建人与自我的冲突?如何使用LLMs:Chain of Verification (CoVe)亲密关系中如何保持同步成长?亲密关系中如何「好好吵架」?|社长日签如何使用python发送日志易告警又是一年中秋夜,小酌一杯人生六十最美滿Python如何使用MySQL 8.2读写分离?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。