Gen 删除

删除记录

删除记录时,需要有条件,否则会引发错误 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)

铂金赞助商

黄金赞助商

铂金赞助商

黄金赞助商