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 の値を現在の時刻に設定し、通常の Query メソッドではそのデータを見つけることができなくなります。

// 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;

関連付けの削除

ソースと引数の間の関係が存在する場合は削除します。参照のみを削除し、DB からオブジェクトを削除することはありません。

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)

プラチナスポンサー

ゴールドスポンサー

プラチナスポンサー

ゴールドスポンサー