はじめに
gormを導入すると、delete関数を実行すれば自動で論理削除してくれたり、クエリを実行する際に自動的に論理削除データを除外してくれたり色々と便利だったのですが、論理削除を復活させるために一旦論理削除済みのデータを抽出する必要が出てきたので調査しましたのでメモ。
やり方
ソースを眺めていたのですが、そもそも公式に書いてあることに気づきました。
http://doc.gorm.io/crud.html#delete
※Soft Deleteの項を参照
通常通り、以下のようにWhere関数で条件を指定すると、論理削除されたデータを除く条件が追加されたSQLが実行されます。
db.Where("age = 20").Find(&user)
実行するSQL
SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;
以下のようにUnscoped()
で取得したdbに対して条件を指定すれば、SQLに条件が追加されません。
db.Unscoped().Where("age = 20").Find(&users)
実行するSQL
SELECT * FROM users WHERE age = 20;
終わりに
github.com/jinzhu/gorm/main.go
を覗いてみると、関数によってはコメントにリファレンスのURLが載っていたりするので、次困ったことがあったらmain.go
を覗いてみようと思います。