国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

?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-11 07:48:56

ORM鏈式輪播圖

2017-07-26 11:32:50

NETRabbitMQ系統集成

2015-11-26 10:53:45

LinuxWindowsMac OS

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

2023-12-14 12:56:00

鏈式調用代碼

2021-03-28 09:17:18

JVM場景鉤子函數

2022-09-14 08:16:48

裝飾器模式對象

2025-07-09 07:20:00

GORMGo分頁

2021-11-19 10:55:03

GitOps運維自動化

2022-09-01 13:12:53

LinuxTC網絡限流

2020-08-24 13:35:59

trycatchJava

2023-06-28 08:25:14

事務SQL語句

2024-01-17 10:16:22

前端國際化消息鍵

2023-01-31 10:29:26

JavaScript國際化國際化庫

2022-06-02 10:02:47

Kubectl更新應用Linux

2020-04-03 13:45:16

刪除Linux垃圾文件
點贊
收藏

51CTO技術棧公眾號

欧美不卡三区| 欧美熟乱第一页| 91成人免费电影| 久久99亚洲精品| 成人女人免费毛片| 免费观看又污又黄在线观看国产| 福利在线免费| 青青九九免费视频在线| 久久久久久免费网| 一区二区三区欧美成人| 雨宫琴音一区二区三区| 日本精品免费一区二区三区| 国产精品一区免费在线| 亚洲欧洲国产伦综合| 幼a在线观看| 欧美视频成人| 欧美一区二区视频免费观看| 国产小黄视频| 91精品欧美福利在线观看| www免费视频观看在线| 国产成人中文字幕| 婷婷综合视频| ww国产内射精品后入国产| 91麻豆精品国产91久久久久久| 在线免费观看一区二区三区| 在线成人h网| 国产91色在线|亚洲| 国产精品videosex极品| 亚洲在线免费观看| 欧美视频二区| 国产伦精品一区二区三区四区免费| 欧美a级片一区| 精品免费国产| 日韩在线卡一卡二| 中文字幕一区二区三区5566| 国产在线精品一区二区夜色| 亚洲色成人www永久在线观看| 国产成人免费高清| 成人在线免费观看av| 中国色在线观看另类| 最新理论片影院| 色婷婷精品久久二区二区蜜臂av | 黄色三级视频在线| 欧美国产一区二区| 九色视频网站| 色素色在线综合| free性欧美hd另类精品| 国产一区二区三区在线看| 欧美日韩视频免费看| 国内久久久精品| 亚洲第一偷拍| 伊人久久大香线蕉综合75| 久久综合狠狠综合久久综合88| 日本xxxxwwww| 欧洲一区二区三区免费视频| 妞干网免费在线视频| 色妞久久福利网| 欧美18hd| 欧美插天视频在线播放| 网红女主播少妇精品视频| 在线电影av不卡网址| 成人午夜av电影| 国产美女搞久久| 亚洲理伦在线| 国产成人生活片| 国产精品不卡视频| 国产九九在线| 中文字幕亚洲欧美日韩在线不卡| 亚欧日韩另类中文欧美| 欧美亚洲另类在线| 欧美成人嫩草网站| 粉嫩av一区二区三区天美传媒| 中文字幕中文字幕在线一区| 欧美日韩在线看片| 精品国产网站地址| 亚洲国产精品久久久久蝴蝶传媒| 日韩中文一区二区三区| 久久久久国产精品麻豆ai换脸| 尤物视频免费在线观看| 亚洲美女视频网| 激情五月综合网| 中文字幕免费高| 亚洲精品乱码久久久久久久久| 四虎av在线| 国产精国产精品| 国产成人av电影| 视频三区在线观看| 中文字幕欧美视频在线| 女人香蕉久久**毛片精品| 免费看黄在线看| 91国产成人在线| 51亚洲精品| 一区二区三区四区视频在线| 天天色 色综合| 日本精品一区二区三区在线观看视频| 欧美日韩在线不卡一区| 亚洲精品成人悠悠色影视| 国产精品专区免费| 国产综合动作在线观看| 久久久精品国产99久久精品芒果 | 午夜精品久久17c| 捆绑紧缚一区二区三区视频| 在线视频2区| 国模吧一区二区三区| 国内精品视频一区二区三区八戒| 男人的天堂在线| 国内久久久精品| 成人精品国产一区二区4080| 18av在线播放| 91丝袜脚交足在线播放| 悠悠色在线精品| 99精品女人在线观看免费视频 | 日韩精品一区二区三区免费观看| 黄色一级在线视频| 日韩三级视频在线观看| 亚洲视频电影在线| 最近中文字幕mv2018在线高清| 欧美日韩成人网| 激情偷乱视频一区二区三区| 求av网址在线观看| 亚洲一区二区三区乱码aⅴ| 国产欧美日韩另类一区| 精品176极品一区| 日本福利视频在线观看| 亚洲精品在线电影| 久久精品道一区二区三区| 搞黄视频免费在线观看| 亚洲va欧美va在线观看| 亚洲综合色在线| 亚洲精品蜜桃乱晃| 国产原创精品在线| 777777777亚洲妇女| 国产精品福利一区| 青青草久久爱| 8x8x8x视频在线观看| 欧美壮男野外gaytube| 亚洲免费在线视频一区 二区| 欧美色资源站| 日本成本人片免费观看| 国产精品18久久久久久首页狼 | 亚洲最新无码中文字幕久久| 国产精品久久久久久久久免费樱桃| 99久久er热在这里只有精品15 | 午夜在线a亚洲v天堂网2018| 久艹在线视频| 国产精品男人爽免费视频1| 中文字幕中文字幕在线一区| 荡女精品导航| 日本三级黄色网址| 97超碰色婷婷| 亚洲激情在线激情| 成人激情诱惑| 国产成人天天5g影院在线观看| 国外成人在线视频网站| 91精品国产高清一区二区三区| 蜜臀av性久久久久蜜臀av麻豆| 日韩成人av电影| 一区二区三区视频在线观看免费| 国产成人97精品免费看片| 狠狠躁18三区二区一区| 精品二区久久| 成人性生交大片免费观看网站| 37pao成人国产永久免费视频| 韩国日本不卡在线| 亚洲一区在线观看免费观看电影高清| 88国产精品视频一区二区三区| 美女黄视频在线观看| 免费看污污视频| 欧美黑人极品猛少妇色xxxxx| 亚洲图片欧美色图| 亚洲免费一区二区| 国产激情久久| 久草视频在线播放| 日本成人三级| 久久亚洲国产精品成人av秋霞| 亚洲影视资源网| 一本色道久久综合亚洲精品不| 日韩av大片站长工具| 成人免费淫片在线费观看| 91免费版网站在线观看| 亚洲精选在线观看| 亚洲人成人一区二区在线观看| 亚洲激情网站| 国产剧情一区二区在线观看| 桃花色综合影院| 国产91沈先生在线播放| 国产成人精品久久| 精品成人a区在线观看| 97国产精品videossex| 欧美久久视频| 亚洲精品成a人ⅴ香蕉片| 在线资源av| 男女激情免费视频| 国产精品日韩欧美| 亚洲精品一区久久久久久| 亚洲线精品一区二区三区八戒| 久久99国产精品久久99 | 欧美日本高清一区| 在线播放亚洲一区| 国产精品高潮呻吟|