GORM(Go Object Relational Mapper)是一個(gè)用于Go語(yǔ)言的ORM庫(kù),它提供了軟刪除(Soft Delete)功能。軟刪除并不會(huì)從數(shù)據(jù)庫(kù)中永久刪除記錄,而是將記錄標(biāo)記為已刪除,這樣在查詢時(shí)可以過(guò)濾掉這些記錄。這對(duì)于保留數(shù)據(jù)完整性和審計(jì)跟蹤非常有用。
在GORM中,軟刪除功能是通過(guò)在模型結(jié)構(gòu)體中添加一個(gè)名為DeletedAt
的字段來(lái)實(shí)現(xiàn)的。這個(gè)字段應(yīng)該是gorm.DeletedAt
類(lèi)型,它是一個(gè)自定義的時(shí)間類(lèi)型,用于表示記錄被刪除的時(shí)間。當(dāng)記錄被刪除時(shí),DeletedAt
字段會(huì)被設(shè)置為當(dāng)前時(shí)間,而不是將記錄從數(shù)據(jù)庫(kù)中完全刪除。
當(dāng)你使用GORM進(jìn)行查詢時(shí),它會(huì)自動(dòng)過(guò)濾掉那些DeletedAt
字段不為空的記錄,因?yàn)檫@意味著這些記錄已經(jīng)被軟刪除。這樣,你的查詢結(jié)果只會(huì)包含未被刪除的記錄。
例如,假設(shè)你有一個(gè)名為User
的模型,它包含一個(gè)DeletedAt
字段:
type User struct {
ID uint
Name string
Email string
DeletedAt gorm.DeletedAt `gorm:"index"`
}
當(dāng)你使用GORM查詢所有用戶時(shí):
var users []User
db.Find(&users)
GORM會(huì)生成類(lèi)似于以下的SQL查詢:
SELECT * FROM users WHERE deleted_at IS NULL;
這個(gè)查詢會(huì)返回所有未被軟刪除的用戶記錄。
如果你想要在查詢中包含已刪除的記錄,可以使用Unscoped
方法:
var users []User
db.Unscoped().Find(&users)
這將生成以下SQL查詢:
SELECT * FROM users;
這個(gè)查詢會(huì)返回所有用戶記錄,包括已被軟刪除的記錄。