新聞中心
需要注意,該特性僅對鏈?zhǔn)讲僮饔行А?/p>

?gdb?模塊支持對數(shù)據(jù)記錄的寫入、更新、刪除時(shí)間自動(dòng)填充,提高開發(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ì)寫入一次。 - ?
updated_at?用于記錄修改時(shí)更新,每次記錄變更時(shí)更新。 - ?
deleted_at?用于記錄的軟刪除特性,只有當(dāng)記錄刪除時(shí)會(huì)寫入一次。
字段名稱其實(shí)不區(qū)分大小寫,也會(huì)忽略特殊字符,例如?CreatedAt?, ?UpdatedAt?, ?DeletedAt?也是支持的。此外,時(shí)間字段名稱可以通過配置文件進(jìn)行自定義修改,并可使用?TimeMaintainDisabled?配置完整關(guān)閉該特性。
對時(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寫入時(shí)間
在執(zhí)行?Insert/InsertIgnore/BatchInsert/BatchInsertIgnore?方法時(shí)自動(dòng)寫入該時(shí)間,隨后保持不變。
// INSERT INTO `user`(`name`,`created_at`,`updated_at`) VALUES('john', `2020-06-06 21:00:00`, `2020-06-06 21:00:00`)
db.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`)
db.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`)
db.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`)
db.Model("user").Data(g.Map{"uid": 10001, "name": "john"}).Save()
需要注意的是?Replace?方法也會(huì)更新該字段,因?yàn)樵摬僮飨喈?dāng)于刪除已存在的舊數(shù)據(jù)并重新寫一條數(shù)據(jù)。
updated_at更新時(shí)間
在執(zhí)行?Insert/InsertIgnore/BatchInsert/BatchInsertIgnore?方法時(shí)自動(dòng)寫入該時(shí)間,在執(zhí)行?Save/Update?時(shí)更新該時(shí)間(注意當(dāng)寫入數(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'
db.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
db.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`)
db.Model("user").Data(g.Map{"id": 1, "name": "john guo"}).Save()
需要注意的是?Replace?方法也會(huì)更新該字段,因?yàn)樵摬僮飨喈?dāng)于刪除已存在的舊數(shù)據(jù)并重新寫一條數(shù)據(jù)。
deleted_at數(shù)據(jù)軟刪除
軟刪除會(huì)稍微比較復(fù)雜一些,當(dāng)軟刪除存在時(shí),所有的查詢語句都將會(huì)自動(dòng)加上?deleted_at?的條件。
// UPDATE `user` SET `deleted_at`='2020-06-06 21:00:00' WHERE uid=10
db.Model("user").Where("uid", 10).Delete()
查詢的時(shí)候會(huì)發(fā)生一些變化,例如:
// SELECT * FROM `user` WHERE uid>1 AND `deleted_at` IS NULL
db.Model("user").Where("uid>?", 1).All()
可以看到當(dāng)數(shù)據(jù)表中存在?deleted_at?字段時(shí),所有涉及到該表的查詢操作都將自動(dòng)加上?deleted_at IS NULL?的條件
聯(lián)表查詢的場景
如果關(guān)聯(lián)查詢的幾個(gè)表都啟用了軟刪除特性時(shí),會(huì)發(fā)生以下這種情況,即條件語句中會(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
db.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
db.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
db.Model("user", "u").LeftJoin("user_detail", "ud", "ud.uid=u.uid").Where("u.uid", 10).Unscoped().One()
分享題目:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈?zhǔn)讲僮?時(shí)間維護(hù)
標(biāo)題網(wǎng)址:http://m.fisionsoft.com.cn/article/dpchhss.html


咨詢
建站咨詢
