レコードの削除
レコードを削除する際、削除される値は主キーを持つ必要があり、そうでない場合は一括削除がトリガーされます。例を挙げます。
// Email's ID is `10` |
主キーによる削除
GORMでは、インライン条件を使って主キーでオブジェクトを削除できます。数値で動作します。詳細については、クエリのインライン条件を確認してください。
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 |
削除された行からのデータの返却
削除されたデータを返却します。これはReturningをサポートするデータベースでのみ動作します。例を挙げます。
// return all columns |
ソフト削除
モデルにgorm.DeletedAt
フィールド(gorm.Model
に含まれています)が含まれている場合、自動的にソフト削除機能が有効になります!
Delete
を呼び出すと、レコードはデータベースから削除されませんが、GORMは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
はDeletedAt
フィールドの値として*time.Time
を使用します。また、gorm.io/plugin/soft_delete
プラグインを使用して他のデータ形式もサポートしています。
INFO DeletedAtフィールドに一意の複合インデックスを作成する場合は、
gorm.io/plugin/soft_delete
プラグインの助けを借りて、Unix秒/フラグのような他のデータ形式を使用する必要があります。例:
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秒
削除フラグとしてUnix秒を使用します。
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 { |