レコードを削除
レコードを1件削除する場合は、主キーを指定する必要があります。主キーを指定しない場合、 一括削除が実行されます。例:
// Email's ID is `10` |
主キーを使用した削除
GORMでは主キーが数値の場合、インライン条件で主キーを指定してオブジェクトを削除することができます。詳細は Query Inline Conditions をチェックしてください。
db.Delete(&User{}, 10) |
削除のフック処理
GORMでは削除時のフック処理に BeforeDelete
, AfterDelete
を利用することができます。これらのメソッドはレコードを削除する際に呼び出されます。 Hooksを参照してください。
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}} |
Global Deleteを防ぐ
何も条件を指定せずに一括削除を行った場合、GORMは削除処理を実行せず、ErrMissingWhereClause
エラーを返します。
条件を指定する、SQLをそのまま実行する、あるいは AllowGlobalUpdate
モードを有効にする必要があります。例:
db.Delete(&User{}).Error // gorm.ErrMissingWhereClause |
削除されたレコードのデータを返却する
Returningをサポートしているデータベースであれば、削除されたデータを取得することができます。例:
// return all columns |
論理削除
(gorm.Model
にも含まれている) gorm.DeletedAt
フィールドがモデルに含まれている場合、そのモデルは自動的に論理削除されるようになります。
Delete
メソッドを実行した際、レコードはデータベースから物理削除されません。代わりに、DeletedAt
フィールドに現在の時刻が設定され、そのレコードは通常のクエリ系のメソッドでは検索できなくなります。
// user's ID is `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
を使用することで、他のデータ形式の対応も可能です。
INFO when creating unique composite index for the DeletedAt field, you must use other data format like unix second/flag with plugin
gorm.io/plugin/soft_delete
‘s help, e.g:
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
Use unix second as delete flag
import "gorm.io/plugin/soft_delete" |
You can also specify to use milli
or nano
seconds as the value, for example:
type User struct { |
Use 1
/ 0
AS Delete Flag
import "gorm.io/plugin/soft_delete" |
Mixed Mode
Mixed mode can use 0
, 1
or unix seconds to mark data as deleted or not, and save the deleted time at the same time.
type User struct { |