自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何使用ORM鏈?zhǔn)讲僮?如何優(yōu)雅的實(shí)現(xiàn)軟刪除?

開(kāi)發(fā) 前端
如果關(guān)聯(lián)查詢的幾個(gè)表都啟用了軟刪除特性時(shí),會(huì)發(fā)生以下這種情況,即條件語(yǔ)句中會(huì)增加所有相關(guān)表的軟刪除時(shí)間判斷。

本期重點(diǎn)

會(huì)帶大家完成【電商實(shí)戰(zhàn)項(xiàng)目】的輪播圖刪除功能,用到的知識(shí)點(diǎn)包括:

  • ORM鏈?zhǔn)讲僮?/li>
  • 如何優(yōu)雅的進(jìn)行時(shí)間維護(hù)
  • 軟刪除和物理刪除的區(qū)別
  • 如何優(yōu)雅的實(shí)現(xiàn)軟刪除
  • 結(jié)合商業(yè)項(xiàng)目需求,有哪些容易踩的坑?

ORM鏈?zhǔn)讲僮?時(shí)間維護(hù)

需要注意,該特性僅對(duì)鏈?zhǔn)讲僮饔行А?/p>

gdb模塊支持對(duì)數(shù)據(jù)記錄的寫(xiě)入、更新、刪除時(shí)間自動(dòng)填充,提高開(kāi)發(fā)維護(hù)效率。為了便于時(shí)間字段名稱、類型的統(tǒng)一維護(hù),如果使用該特性,我們約定:

  • 字段應(yīng)當(dāng)設(shè)置允許值為null。
  • 字段的類型必須為時(shí)間類型,如:date?,  datetime?,  timestamp?。不支持?jǐn)?shù)字類型字段,如int。
  • 字段的名稱不支持自定義設(shè)置,并且固定名稱約定為:

created_at用于保存記錄的創(chuàng)建時(shí)間,僅會(huì)寫(xiě)入一次。

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

deleted_at用于保存記錄的軟刪除特性,只有當(dāng)記錄刪除時(shí)會(huì)寫(xiě)入一次。

字段名稱其實(shí)不區(qū)分大小寫(xiě),也會(huì)忽略特殊字符,例如CreatedAt?,  UpdatedAt?,  DeletedAt?也是支持的。此外,時(shí)間字段名稱可以通過(guò)配置文件進(jìn)行自定義修改,并可使用TimeMaintainDisabled配置完整關(guān)閉該特性,具體請(qǐng)參考 ORM使用配置 章節(jié)。

對(duì)時(shí)間類型的固定其實(shí)是為了形成一種規(guī)范。

特性的啟用

當(dāng)數(shù)據(jù)表包含created_at、updated_at、deleted_at任意一個(gè)或多個(gè)字段時(shí),該特性自動(dòng)啟用。

以下的示例中,我們默認(rèn)示例中的數(shù)據(jù)表均包含了這3個(gè)字段。

?created_at??寫(xiě)入時(shí)間

在執(zhí)行Insert/InsertIgnore/BatchInsert/BatchInsertIgnore方法時(shí)自動(dòng)寫(xiě)入該時(shí)間,隨后保持不變。

// 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方法也會(huì)更新該字段,因?yàn)樵摬僮飨喈?dāng)于刪除已存在的舊數(shù)據(jù)并重新寫(xiě)一條數(shù)據(jù)。

?updated_at??更新時(shí)間

在執(zhí)行Insert/InsertIgnore/BatchInsert/BatchInsertIgnore?方法時(shí)自動(dòng)寫(xiě)入該時(shí)間,在執(zhí)行Save/Update?時(shí)更新該時(shí)間(注意當(dāng)寫(xiě)入數(shù)據(jù)存在時(shí)會(huì)更新updated_at?時(shí)間,不會(huì)更新created_at時(shí)間)。

// 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方法也會(huì)更新該字段,因?yàn)樵摬僮飨喈?dāng)于刪除已存在的舊數(shù)據(jù)并重新寫(xiě)一條數(shù)據(jù)。

?deleted_at??數(shù)據(jù)軟刪除

軟刪除會(huì)稍微比較復(fù)雜一些,當(dāng)軟刪除存在時(shí),所有的查詢語(yǔ)句都將會(huì)自動(dòng)加上deleted_at的條件。

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

查詢的時(shí)候會(huì)發(fā)生一些變化,例如:

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

可以看到當(dāng)數(shù)據(jù)表中存在deleted_at?字段時(shí),所有涉及到該表的查詢操作都將自動(dòng)加上deleted_at IS NULL的條件

聯(lián)表查詢的場(chǎng)景

如果關(guān)聯(lián)查詢的幾個(gè)表都啟用了軟刪除特性時(shí),會(huì)發(fā)生以下這種情況,即條件語(yǔ)句中會(huì)增加所有相關(guān)表的軟刪除時(shí)間判斷。

// 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忽略時(shí)間特性

Unscoped?用于在鏈?zhǔn)讲僮髦泻雎宰詣?dòng)時(shí)間更新特性,例如上面的示例,加上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()

以上內(nèi)容來(lái)源自官方文檔:https://goframe.org/pages/viewpage.action?pageId=1114139

軟刪除和物理刪除的區(qū)別

  • 軟刪除也叫標(biāo)記刪除,通過(guò)字段標(biāo)記DB中的紀(jì)錄是否被刪除:

比如通過(guò)is_delete字段標(biāo)記,默認(rèn)為0,刪除時(shí)設(shè)置為1

或者和視頻內(nèi)容一樣,使用deleted_at字段標(biāo)記刪除的時(shí)間,默認(rèn)為null

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

如何優(yōu)雅的實(shí)現(xiàn)軟刪除

如果你詳細(xì)看完了ORM鏈?zhǔn)讲僮?時(shí)間維護(hù)這部分內(nèi)容,想必心中一定有了答案。

結(jié)合商業(yè)項(xiàng)目需求,有哪些容易踩的坑?

一定要結(jié)合實(shí)際情況決定使用物理刪除還是軟刪除,下面的例子拋轉(zhuǎn)引玉:

1. 比如管理后臺(tái)刪除輪播圖這種操作建議使用軟刪除。因?yàn)榭赡艹霈F(xiàn)誤操作的情況,軟刪除可以及時(shí)找回;而且輪播圖的數(shù)據(jù)往往不多,冗余保存也是沒(méi)有問(wèn)題的。

2. 再比如用戶移除收藏文章的記錄,建議物理刪除。原因是收藏文章,取消收藏這類操作比較隨意,沒(méi)有任何風(fēng)險(xiǎn)。再者這類數(shù)據(jù)量比較龐大,軟刪除沒(méi)有意義,反而會(huì)增加收藏操作的邏輯壓力和DB壓力。

本文轉(zhuǎn)載自微信公眾號(hào)「 程序員升級(jí)打怪之旅」,作者「王中陽(yáng)Go」,可以通過(guò)以下二維碼關(guān)注。

轉(zhuǎn)載本文請(qǐng)聯(lián)系「 程序員升級(jí)打怪之旅」公眾號(hào)。

責(zé)任編輯:武曉燕 來(lái)源: 程序員升級(jí)打怪之旅
相關(guān)推薦

2022-11-15 07:50:47

ORM鏈?zhǔn)讲僮?/a>刪除

2015-11-26 10:53:45

LinuxWindowsMac OS

2017-07-26 11:32:50

NETRabbitMQ系統(tǒng)集成

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

數(shù)組多維五維數(shù)組

2023-06-16 09:08:39

ReactContextRFC

2023-12-14 12:56:00

鏈?zhǔn)?/a>調(diào)用代碼

2021-03-28 09:17:18

JVM場(chǎng)景鉤子函數(shù)

2022-09-14 08:16:48

裝飾器模式對(duì)象

2021-11-19 10:55:03

GitOps運(yùn)維自動(dòng)化

2022-09-01 13:12:53

LinuxTC網(wǎng)絡(luò)限流

2020-08-24 13:35:59

trycatchJava

2024-01-17 10:16:22

前端國(guó)際化消息鍵

2023-01-31 10:29:26

JavaScript國(guó)際化國(guó)際化庫(kù)

2023-06-28 08:25:14

事務(wù)SQL語(yǔ)句

2020-04-03 13:45:16

刪除Linux垃圾文件

2020-02-24 11:12:01

Linux電腦數(shù)據(jù)

2022-06-02 10:02:47

Kubectl更新應(yīng)用Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)