Gen Delete

刪除記錄

刪除記錄時,需要有任何條件,否則會引發錯誤 ErrMissingWhereClause,例如

e := query.Email

// Email's ID is `10`
e.WithContext(ctx).Where(e.ID.Eq(10)).Delete()
// DELETE from emails where id = 10;

// Delete with additional conditions
e.WithContext(ctx).Where(e.ID.Eq(10), e.Name.Eq("modi")).Delete()
// DELETE from emails where id = 10 AND name = "modi";

result, err := e.WithContext(ctx).Where(e.ID.Eq(10), e.Name.Eq("modi")).Delete()

result.RowsAffected // affect rows number
err // error

使用主鍵刪除

GEN 允許使用內嵌條件刪除具有主鍵的物件,它適用於數字。

u.WithContext(ctx).Where(u.ID.In(1,2,3)).Delete()
// DELETE FROM users WHERE id IN (1,2,3);

批次刪除

指定的數值沒有主鍵值,GEN 會執行批次刪除,它會刪除所有符合條件的記錄

e := query.Email

e.WithContext(ctx).Where(e.Name.Like("%modi%")).Delete()
// DELETE from emails where email LIKE "%modi%";

軟刪除

如果您的模型包含 gorm.DeletedAt 欄位(包含在 gorm.Model 中),它會自動獲得軟刪除功能!

呼叫 Delete 時,記錄不會從資料庫中移除,但 GORM 會將 DeletedAt 的值設定為目前時間,且資料不再會透過一般查詢方法找到。

// Batch Delete
u.WithContext(ctx).Where(u.Age.Eq(20)).Delete()
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;

// Soft deleted records will be ignored when querying
users, err := u.WithContext(ctx).Where(u.Age.Eq(20)).Find()
// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;

如果您不想包含 gorm.Model,您可以像這樣啟用軟刪除功能

type User struct {
ID int
Deleted gorm.DeletedAt
Name string
}

尋找軟刪除記錄

您可以使用 Unscoped 尋找軟刪除記錄

users, err := db.WithContext(ctx).Unscoped().Where(u.Age.Eq(20)).Find()
// SELECT * FROM users WHERE age = 20;

永久刪除

您可以使用 Unscoped 永久刪除符合條件的記錄

o.WithContext(ctx).Unscoped().Where(o.ID.Eq(10)).Delete()
// DELETE FROM orders WHERE id=10;

刪除關聯

移除來源與引數之間的關係(如果存在),只刪除參考,不會從資料庫中刪除那些物件。

u := query.User

u.Languages.Model(&user).Delete(&languageZH, &languageEN)

u.Languages.Model(&user).Delete([]*Language{&languageZH, &languageEN}...)

使用 Select 刪除

在刪除記錄時,您可以使用 Select 刪除選定的 has one/has many/many2many 關係,例如

u := query.User

// delete user's account when deleting user
u.Select(u.Account).Delete(&user)

// delete user's Orders, CreditCards relations when deleting user
db.Select(u.Orders.Field(), u.CreditCards.Field()).Delete(&user)

// delete user's has one/many/many2many relations when deleting user
db.Select(field.AssociationsFields).Delete(&user)

白金贊助商

金牌贊助商

白金贊助商

金牌贊助商