gorm的使用与软删除

gorm的使用与软删除

这个作业属于哪个课程 2021春软件工程实践|W班 (福州大学)
这个作业要求在哪里 软件工程实践总结&个人技术博客
这个作业的目标 课程回顾与个人技术总结
其他参考文献 GORM 中文文档

技术概述

GORM是优秀的Golang ORM类库,是用于与数据库的连接交互的框架。本次软工实践团队使用go语言进行后端开发,采用了gorm进行数据库的CRUD操作,因此我学习了这项技术进行部分后端接口开发。使用该框架的主要难点是之前没有使用go的经历,搭建相关环境,配置文件等较为麻烦。

技术详述

1.配置文件

image

2.连接数据库

image
使用Sprintf语句在函数调用时同时输出各个参数以方便检验。

3.CRUD

image

  • db.Where().First()语句实现查询功能,采用了原生sql的方式,其中db.First()获取第一条记录,按主键排序。
    类似的有:db.Take()获取一条记录,不指定排序
    db.Last(&user)获取最后一条记录,按主键排序
    db.Find(&users)获取所有的记录
    db.First(&user, 10) 通过主键进行查询 (仅适用于主键是数字类型)

  • 其他增删改查类似语句均可在官方文档中得到

问题和解决过程

  • 问题:系统的部分超级管理员可以恢复已经被删除的管理员信息,需要实现相关设计。

  • 解决过程:
    image
    在DeleteAdmin方法中,我手动实现了软删除,先获取相关id为不删除的记录数量,若为0则返回不存在。若存在,则对于特定id的admin将字段IsDelete更新置为1。

    但在Gorm的使用中我了解到,gorm本身自带软删除的功能:即可以使用gorm.Model实现软删除,只是更新这一条删除数据的状态,并且记录删除时间。grom中如果模型中有"deleted_at"字段,当删除的时候,仅更新"deleted_at"字段,而不是直接删除。因此只需要在表字段添加"deleted_at"字段,相关字段类型为*time.Time,字段可为NULL或nil。

    image

    参考官方文档,若不想引入gorm.Model,也可以这样启用软删除特性:

    type User struct {
    ID      int
    Deleted gorm.DeletedAt
    Name    string
    }
    

    可以使用Unscoped找到被软删除的记录:

    db.Unscoped().Where("xxx").Find(&xxx)
    

    也可以永久删除匹配的记录:

    db.Unscoped().Delete(&xxx)
    

    gorm查询的时候,通过打印sql语句可以发现查询语句都自带条件:where deleted_at is null。gorm查询的时候是不会去查询那些已经被软删除的记录的,即使手动加上where deleted_at is not null也是无法查询到的,这也是体现软删除的作用。

    但软删除也存在问题。例如因为软删除的缘故,主键的ID不会释放,如果新插入的ID和软删除的记录相同则会失败。所以在删除前,可以使用Update更新一下id,使之和当前数据的不同。

总结

团队选择的go语言是相对容易上手的,因此实现一些简单的接口没有太大的困难。gorm提供了大量简单的操作的实现,而相对复杂 的查询也能通过sql实现。gorm是相对用户友好的ORM库,在使用中除了方便也可以加深对一些概念的理解。

参考文献

GORM 中文文档 v2

posted @ 2021-06-28 12:51  Guodd  阅读(3306)  评论(0编辑  收藏  举报