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

?gdb?模塊支持對數(shù)據(jù)記錄的寫入、更新、刪除時間自動填充,提高開發(fā)維護(hù)效率。為了便于時間字段名稱、類型的統(tǒng)一維護(hù),如果使用該特性,我們約定:
- 字段應(yīng)當(dāng)設(shè)置允許值為?
null?。 - 字段的類型必須為時間類型,如:?
date?, ?datetime?, ?timestamp?。不支持?jǐn)?shù)字類型字段,如?int?。 - 字段的名稱不支持自定義設(shè)置,并且固定名稱約定為:
- ?
created_at?用于記錄創(chuàng)建時更新,僅會寫入一次。 - ?
updated_at?用于記錄修改時更新,每次記錄變更時更新。 - ?
deleted_at?用于記錄的軟刪除特性,只有當(dāng)記錄刪除時會寫入一次。
字段名稱其實不區(qū)分大小寫,也會忽略特殊字符,例如?CreatedAt?, ?UpdatedAt?, ?DeletedAt?也是支持的。此外,時間字段名稱可以通過配置文件進(jìn)行自定義修改,并可使用?TimeMaintainDisabled?配置完整關(guān)閉該特性。
對時間類型的固定其實是為了形成一種規(guī)范。
特性的啟用
當(dāng)數(shù)據(jù)表包含?created_at?、?updated_at?、?deleted_at?任意一個或多個字段時,該特性自動啟用。
以下的示例中,我們默認(rèn)示例中的數(shù)據(jù)表均包含了這3個字段。
created_at寫入時間
在執(zhí)行?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`)
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?方法也會更新該字段,因為該操作相當(dāng)于刪除已存在的舊數(shù)據(jù)并重新寫一條數(shù)據(jù)。
updated_at更新時間
在執(zhí)行?Insert/InsertIgnore/BatchInsert/BatchInsertIgnore?方法時自動寫入該時間,在執(zhí)行?Save/Update?時更新該時間(注意當(dāng)寫入數(shù)據(jù)存在時會更新?updated_at?時間,不會更新?created_at?時間)。
// 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?方法也會更新該字段,因為該操作相當(dāng)于刪除已存在的舊數(shù)據(jù)并重新寫一條數(shù)據(jù)。
deleted_at數(shù)據(jù)軟刪除
軟刪除會稍微比較復(fù)雜一些,當(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()
查詢的時候會發(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?字段時,所有涉及到該表的查詢操作都將自動加上?deleted_at IS NULL?的條件
聯(lián)表查詢的場景
如果關(guān)聯(lián)查詢的幾個表都啟用了軟刪除特性時,會發(fā)生以下這種情況,即條件語句中會增加所有相關(guān)表的軟刪除時間判斷。
// 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忽略時間特性
?Unscoped?用于在鏈?zhǔn)讲僮髦泻雎宰詣訒r間更新特性,例如上面的示例,加上?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()
網(wǎng)站名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈?zhǔn)讲僮?時間維護(hù)
URL分享:http://m.5511xx.com/article/dpchhss.html


咨詢
建站咨詢
