成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用ORM鏈式操作?如何優雅的實現軟刪除?

開發 前端
如果關聯查詢的幾個表都啟用了軟刪除特性時,會發生以下這種情況,即條件語句中會增加所有相關表的軟刪除時間判斷。

本期重點

會帶大家完成【電商實戰項目】的輪播圖刪除功能,用到的知識點包括:

  • ORM鏈式操作
  • 如何優雅的進行時間維護
  • 軟刪除和物理刪除的區別
  • 如何優雅的實現軟刪除
  • 結合商業項目需求,有哪些容易踩的坑?

ORM鏈式操作-時間維護

需要注意,該特性僅對鏈式操作有效。

gdb模塊支持對數據記錄的寫入、更新、刪除時間自動填充,提高開發維護效率。為了便于時間字段名稱、類型的統一維護,如果使用該特性,我們約定:

  • 字段應當設置允許值為null。
  • 字段的類型必須為時間類型,如:date?,  datetime?,  timestamp?。不支持數字類型字段,如int。
  • 字段的名稱不支持自定義設置,并且固定名稱約定為:

created_at用于保存記錄的創建時間,僅會寫入一次。

updated_at用于保存記錄的修改時間,每次記錄變更時更新。

deleted_at用于保存記錄的軟刪除特性,只有當記錄刪除時會寫入一次。

字段名稱其實不區分大小寫,也會忽略特殊字符,例如CreatedAt?,  UpdatedAt?,  DeletedAt?也是支持的。此外,時間字段名稱可以通過配置文件進行自定義修改,并可使用TimeMaintainDisabled配置完整關閉該特性,具體請參考 ORM使用配置 章節。

對時間類型的固定其實是為了形成一種規范。

特性的啟用

當數據表包含created_at、updated_at、deleted_at任意一個或多個字段時,該特性自動啟用。

以下的示例中,我們默認示例中的數據表均包含了這3個字段。

?created_at??寫入時間

在執行Insert/InsertIgnore/BatchInsert/BatchInsertIgnore方法時自動寫入該時間,隨后保持不變。

// INSERT INTO `user`(`name`,`created_at`,`updated_at`) VALUES('john', `2020-06-06 21:00:00`, `2020-06-06 21:00:00`)
g.Model("user").Data(g.Map{"name": "john"}).Insert()

// INSERT IGNORE INTO `user`(`uid`,`name`,`created_at`,`updated_at`) VALUES(10000,'john', `2020-06-06 21:00:00`, `2020-06-06 21:00:00`)
g.Model("user").Data(g.Map{"uid": 10000, "name": "john"}).InsertIgnore()

// REPLACE INTO `user`(`uid`,`name`,`created_at`,`updated_at`) VALUES(10000,'john', `2020-06-06 21:00:00`, `2020-06-06 21:00:00`)
g.Model("user").Data(g.Map{"uid": 10000, "name": "john"}).Replace()

// INSERT INTO `user`(`uid`,`name`,`created_at`,`updated_at`) VALUES(10001,'john', `2020-06-06 21:00:00`, `2020-06-06 21:00:00`) ON DUPLICATE KEY UPDATE `uid`=VALUES(`uid`),`name`=VALUES(`name`),`updated_at`=VALUES(`updated_at`)
g.Model("user").Data(g.Map{"uid": 10001, "name": "john"}).Save()

需要注意的是Replace方法也會更新該字段,因為該操作相當于刪除已存在的舊數據并重新寫一條數據。

?updated_at??更新時間

在執行Insert/InsertIgnore/BatchInsert/BatchInsertIgnore?方法時自動寫入該時間,在執行Save/Update?時更新該時間(注意當寫入數據存在時會更新updated_at?時間,不會更新created_at時間)。

// UPDATE `user` SET `name`='john guo',`updated_at`='2020-06-06 21:00:00' WHERE name='john'
g.Model("user").Data(g.Map{"name" : "john guo"}).Where("name", "john").Update()

// UPDATE `user` SET `status`=1,`updated_at`='2020-06-06 21:00:00' ORDER BY `login_time` asc LIMIT 10
g.Model("user").Data("status", 1).Order("login_time asc").Limit(10).Update()

// INSERT INTO `user`(`id`,`name`,`update_at`) VALUES(1,'john guo','2020-12-29 20:16:14') ON DUPLICATE KEY UPDATE `id`=VALUES(`id`),`name`=VALUES(`name`),`update_at`=VALUES(`update_at`)
g.Model("user").Data(g.Map{"id": 1, "name": "john guo"}).Save()

需要注意的是Replace方法也會更新該字段,因為該操作相當于刪除已存在的舊數據并重新寫一條數據。

?deleted_at??數據軟刪除

軟刪除會稍微比較復雜一些,當軟刪除存在時,所有的查詢語句都將會自動加上deleted_at的條件。

// UPDATE `user` SET `deleted_at`='2020-06-06 21:00:00' WHERE uid=10
g.Model("user").Where("uid", 10).Delete()

查詢的時候會發生一些變化,例如:

// SELECT * FROM `user` WHERE uid>1 AND `deleted_at` IS NULL
g.Model("user").Where("uid>?", 1).All()

可以看到當數據表中存在deleted_at?字段時,所有涉及到該表的查詢操作都將自動加上deleted_at IS NULL的條件

聯表查詢的場景

如果關聯查詢的幾個表都啟用了軟刪除特性時,會發生以下這種情況,即條件語句中會增加所有相關表的軟刪除時間判斷。

// SELECT * FROM `user` AS `u` LEFT JOIN `user_detail` AS `ud` ON (ud.uid=u.uid) WHERE u.uid=10 AND `u`.`deleted_at` IS NULL AND `ud`.`deleteat` IS NULL LIMIT 1
g.Model("user", "u").LeftJoin("user_detail", "ud", "ud.uid=u.uid").Where("u.uid", 10).One()

Unscoped忽略時間特性

Unscoped?用于在鏈式操作中忽略自動時間更新特性,例如上面的示例,加上Unscoped方法后:

// SELECT * FROM `user` WHERE uid>1
g.Model("user").Unscoped().Where("uid>?", 1).All()

// SELECT * FROM `user` AS `u` LEFT JOIN `user_detail` AS `ud` ON (ud.uid=u.uid) WHERE u.uid=10 LIMIT 1
g.Model("user", "u").LeftJoin("user_detail", "ud", "ud.uid=u.uid").Where("u.uid", 10).Unscoped().One()

以上內容來源自官方文檔:https://goframe.org/pages/viewpage.action?pageId=1114139

軟刪除和物理刪除的區別

  • 軟刪除也叫標記刪除,通過字段標記DB中的紀錄是否被刪除:

比如通過is_delete字段標記,默認為0,刪除時設置為1

或者和視頻內容一樣,使用deleted_at字段標記刪除的時間,默認為null

  • 物理刪除,就是直接將DB中的記錄刪掉

如何優雅的實現軟刪除

如果你詳細看完了ORM鏈式操作-時間維護這部分內容,想必心中一定有了答案。

結合商業項目需求,有哪些容易踩的坑?

一定要結合實際情況決定使用物理刪除還是軟刪除,下面的例子拋轉引玉:

1. 比如管理后臺刪除輪播圖這種操作建議使用軟刪除。因為可能出現誤操作的情況,軟刪除可以及時找回;而且輪播圖的數據往往不多,冗余保存也是沒有問題的。

2. 再比如用戶移除收藏文章的記錄,建議物理刪除。原因是收藏文章,取消收藏這類操作比較隨意,沒有任何風險。再者這類數據量比較龐大,軟刪除沒有意義,反而會增加收藏操作的邏輯壓力和DB壓力。

本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「王中陽Go」,可以通過以下二維碼關注。

轉載本文請聯系「 程序員升級打怪之旅」公眾號。

責任編輯:武曉燕 來源: 程序員升級打怪之旅
相關推薦

2022-11-15 07:50:47

ORM鏈式操作刪除

2015-11-26 10:53:45

LinuxWindowsMac OS

2017-07-26 11:32:50

NETRabbitMQ系統集成

2018-08-20 10:40:09

Redis位圖操作

2009-06-02 17:27:28

Hibernate框架ORM

2020-08-26 07:17:19

通信

2022-02-18 17:34:47

數組多維五維數組

2023-06-16 09:08:39

ReactContextRFC

2021-03-28 09:17:18

JVM場景鉤子函數

2022-09-14 08:16:48

裝飾器模式對象

2023-12-14 12:56:00

鏈式調用代碼

2021-11-19 10:55:03

GitOps運維自動化

2022-09-01 13:12:53

LinuxTC網絡限流

2020-08-24 13:35:59

trycatchJava

2020-04-03 13:45:16

刪除Linux垃圾文件

2022-06-02 10:02:47

Kubectl更新應用Linux

2017-08-01 07:31:55

Router模塊化頁面

2024-01-17 10:16:22

前端國際化消息鍵

2023-01-31 10:29:26

JavaScript國際化國際化庫

2023-06-28 08:25:14

事務SQL語句
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人网 | 在线免费视频一区 | 国产免费一区二区三区最新6 | 亚洲激情第一页 | 一级毛片播放 | 欧美中文字幕在线观看 | 欧美日韩免费视频 | 91精品国产一区二区三区香蕉 | 成年人在线视频 | 韩国毛片视频 | av激情影院 | 成人国产精品入口免费视频 | 日韩一区二区三区精品 | 亚洲精品v | 成人在线a | 国产精品资源在线 | 国产人成在线观看 | 91豆花视频 | 亚洲精品日韩在线 | 久久久久一区二区 | 国产精品久久久久久久久污网站 | 国产精品a一区二区三区网址 | 欧美11一13sex性hd | 亚洲va欧美va天堂v国产综合 | 亚洲精品综合 | 国产精品久久久久一区二区三区 | 久久一| 久久久91| 国产视频精品区 | 亚洲国产精品一区二区第一页 | 国产欧美一区二区精品久导航 | 亚洲欧美国产精品久久 | 国产在线观 | 国产目拍亚洲精品99久久精品 | 精品国产乱码久久久久久a丨 | 国产精品一二三区 | 国产99热精品 | 午夜精品一区二区三区三上悠亚 | 一级片免费视频 | 国产精品一区二区三 | 懂色中文一区二区在线播放 |