1. 程式人生 > 其它 >gorm的使用與軟刪除

gorm的使用與軟刪除

gorm的使用與軟刪除

這個作業屬於哪個課程 2021春軟體工程實踐|W班 (福州大學)
這個作業要求在哪裡 軟體工程實踐總結&個人技術部落格
這個作業的目標 課程回顧與個人技術總結
其他參考文獻 GORM 中文文件
目錄

技術概述

GORM是優秀的Golang ORM類庫,是用於與資料庫的連線互動的框架。本次軟工實踐團隊使用go語言進行後端開發,採用了gorm進行資料庫的CRUD操作,因此我學習了這項技術進行部分後端介面開發。使用該框架的主要難點是之前沒有使用go的經歷,搭建相關環境,配置檔案等較為麻煩。

技術詳述

1.配置檔案

2.連線資料庫


使用Sprintf語句在函式呼叫時同時輸出各個引數以方便檢驗。

3.CRUD

  • db.Where().First()語句實現查詢功能,採用了原生sql的方式,其中db.First()獲取第一條記錄,按主鍵排序。
    類似的有:db.Take()獲取一條記錄,不指定排序
    db.Last(&user)獲取最後一條記錄,按主鍵排序
    db.Find(&users)獲取所有的記錄
    db.First(&user, 10) 通過主鍵進行查詢 (僅適用於主鍵是數字型別)

  • 其他增刪改查類似語句均可在官方文件中得到

問題和解決過程

  • 問題:系統的部分超級管理員可以恢復已經被刪除的管理員資訊,需要實現相關設計。

  • 解決過程:

    在DeleteAdmin方法中,我手動實現了軟刪除,先獲取相關id為不刪除的記錄數量,若為0則返回不存在。若存在,則對於特定id的admin將欄位IsDelete更新置為1。

    但在Gorm的使用中我瞭解到,gorm本身自帶軟刪除的功能:即可以使用gorm.Model實現軟刪除,只是更新這一條刪除資料的狀態,並且記錄刪除時間。grom中如果模型中有"deleted_at"欄位,當刪除的時候,僅更新"deleted_at"欄位,而不是直接刪除。因此只需要在表字段新增"deleted_at"欄位,相關欄位型別為*time.Time,欄位可為NULL或nil。

    參考官方文件,若不想引入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