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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM