Railsでデータベースのデータを削除するには
Railsでデータベースのレコードをいったん全て消したい時があると思いますが、やり方は少なくとも3通りあります。どれでもレコードを削除できますが、少しだけ違いがあります。
準備
rails new
で新規アプリ作成
↓
Itemsテーブル作成(カラムはnameとprice)
↓
db/seeds.rb
に以下のように記述
Item.create(name: "pen", price: 100) Item.create(name: "notebook", price: 120) Item.create(name: "textbook", price: 1000)
seedについてはこちらの記事で書きました。
↓
rails db:seed
を実行
これで準備完了です。
delete_allメソッド
delete_allメソッドを使うことで、テーブルのレコードを全て削除することができます。あくまでレコードを消すだけなので、idはリセットされません。
例えば先ほどの例で以下のようなコマンドを実行します。
% rails c > Item.delete_all > exit % rails db:seed
はじめに作ったレコードが削除され、新しくレコードが作成されました。ただしidは4から始まっています。
rails db:reset
Railsのコマンドで、データベースをリセットすることができます。テーブル自体をいったん削除し、改めて生成しているみたいです。
% rails db:reset
また、データベースをリセットした後にseedまで自動で行ってくれるので、テーブルにはすでにレコードが入っています。
rails db:migrate:reset
db:reset
と似たようなコマンドで、db:migrate:reset
というのがあります。
db:reset
との違いは2つ。
一つ目。db:migrate:reset
では、マイグレーションファイルの変更を反映してくれます。マイグレーションファイルを編集してからデータベースをリセットしたいときは、db:migrate:reset
の方がいいかもしれません。
いったんロールバックしてから再度マイグレーションを行っている感じなんですかね?
そして二つ目の違い。db:migrate:reset
では、自動でseedは行われません。必要であればrails db:seed
を手動で実行します。
先ほどのItemsテーブルについて、マイグレーションファイルでカラム名をnameからitem_nameに変更してコマンドを実行してみます。
% rails db:migrate:reset
カラム名がitem_nameに変わっています。そして元々のレコードは無くなり、新しいレコードは生成されていません。
db/seeds.rb
の属性名をnameからitem_nameに変更してターミナルでseedを実行すれば、データを生成することができます。
まとめ
- DBの中身を削除する方法は色々ある
- delete_allメソッドでは、レコードを削除するがリセットはされない
- db:resetはDBをリセットしてseedまで実行
- de:migrate:resetはマイグレーションファイルの変更を読んでくれる