GORMでデータベースのレコードが削除されない時の対処法


はじめに

Gormを使用してデータベースを操作していましたが、レコードを削除した際にアプリ上で見ると消えているもののデータベース上には残っていることに気が付きました。
筆者の場合は、ユーザーのメールアドレスを一意な値にしたことで、「新規登録」→「ユーザー削除」→「同じアドレスで再登録」した際にデータベースでエラーが起きていました。

対処法

対処前に書いていたユーザー削除のコードは以下になります。

func DbDeleteUser(id int) {
	d := db.GormConnect()
	d.Delete(&User{}, id)
	defer d.Close()
}

この書き方だと、論理削除といってレコードがデータベースから物理的に削除されるわけではなく、通常のクエリ系のメソッドで検索できなくなるだけのようです。

対処後のコードは以下になります。

func DbDeleteUser(id int) {
	d := db.GormConnect()
	d.Unscoped().Delete(&User{}, id) //ここを変更
	defer d.Close()
}

Unscoped()を追加することでレコードをデータベースから物理的に削除することができます。