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庫,在使用中除了方便也可以加深對一些概念的理解。