Удалить запись
При удалении записи, удаляемое значение должно иметь первичный ключ или сработает пакетное удаление, например:
// ID в struct Email равно `10` |
Удалить с помощью первичного ключа
GORM позволяет удалять объекты по первичному ключу (ключам) с помощью встроенного условия, оно работает с числами, подробности смотрите в Query Inline Conditions
db.Delete(&User{}, 10) |
Хуки удаления
GORM поддерживает хуки BeforeDelete (перед удалением)
, AfterDelete (после удаления)
, эти методы будут вызваны при удалении записи, смотрите Хуки для подробностей
func (u *User) BeforeDelete(tx *gorm.DB) (err error) { |
Пакетное удаление
Первичный ключ не указан и GORM выполнит пакетное удаление, при этом будут удалены все совпадающие записи
db.Where("email LIKE ?", "%jinzhu%").Delete(&Email{}) |
Чтобы эффективно удалить большое количество записей, передайте фрагмент с первичными ключами методу Delete
.
var users = []User{{ID: 1}, {ID: 2}, {ID: 3}} |
Запрет глобального удаления
Если вы выполните пакетное удаление без каких-либо условий, GORM НЕ запустит его и вернет ошибку ErrMissingWhereClause
Вы должны использовать некоторые условия, или использовать необработанный SQL, или включить режим AllowGlobalUpdate
, например:
db.Delete(&User{}).Error // gorm.ErrMissingWhereClause |
Возврат данных при удалении строк
Возвращает удаленные данные, работает только для базы данных поддерживающих Возврат, например:
// вернуть все колонки |
Мягкое удаление
Если ваша модель включает в себя поле gorm.DeletedAt
(которое включено в gorm.Model
), она автоматически получит возможность мягкого удаления!
При вызове Delete
запись НЕ будет удалена из базы данных, но GORM установит значение DeletedAt
на текущее время, и данные больше не будут доступны для поиска обычными методами запроса.
// ID пользователя равно `111` |
Если вы не хотите включать gorm.Model
, вы можете включить функцию мягкого удаления следующим образом:
type User struct { |
Найти записи после мягкого удаления
Вы можете найти автоматически удаленные записи с помощью Unscoped
db.Unscoped().Where("age = 20").Find(&users) |
Безвозвратное удаление
Вы можете навсегда удалить совпадающие записи с помощью Unscoped
db.Unscoped().Delete(&order) |
Флаги удаления
По умолчанию gorm.Model
использует *time.Time
в качестве значения для поля DeletedAt
, и оно обеспечивает поддержку других форматов данных с помощью плагина gorm.io/plugin/soft_delete
ИНФОРМАЦИЯ при создании уникального составного индекса для поля DeletedAt вы должны использовать другой формат данных, например unix second/flag с плагином
gorm.io/plugin/soft_delete
, например:
import "gorm.io/plugin/soft_delete"
type User struct {
ID uint
Name string `gorm:"uniqueIndex:udx_name"`
DeletedAt soft_delete.DeletedAt `gorm:"uniqueIndex:udx_name"`
}
Unix Second
Используйте unix second в качестве флага удаления
import "gorm.io/plugin/soft_delete" |
Вы также можете указать, что в качестве значения следует использовать milli
или nano
секунды, например:
type User struct { |
Использование 1
/ 0
, как флагов на удаление
import "gorm.io/plugin/soft_delete" |
Смешанный режим
Смешанный режим может использовать 0
, 1
или секунды unix, чтобы пометить данные как удаленные или нет, и одновременно сохранить время удаления.
type User struct { |