Railsでデータベースのデータを削除するには

f:id:endoakak:20200727195747j:plain

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についてはこちらの記事で書きました。

endoakak.hatenablog.com

rails db:seedを実行

f:id:endoakak:20200813091707p:plain:w200

これで準備完了です。

delete_allメソッド

delete_allメソッドを使うことで、テーブルのレコードを全て削除することができます。あくまでレコードを消すだけなので、idはリセットされません。

例えば先ほどの例で以下のようなコマンドを実行します。

% rails c
> Item.delete_all
> exit
% rails db:seed

はじめに作ったレコードが削除され、新しくレコードが作成されました。ただしidは4から始まっています。

f:id:endoakak:20200813092903p:plain:w200

rails db:reset

Railsのコマンドで、データベースをリセットすることができます。テーブル自体をいったん削除し、改めて生成しているみたいです。

% rails db:reset

f:id:endoakak:20200813093530p:plain:h60

また、データベースをリセットした後にseedまで自動で行ってくれるので、テーブルにはすでにレコードが入っています。

f:id:endoakak:20200813093816p:plain:w200

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

f:id:endoakak:20200813094859p:plain

カラム名がitem_nameに変わっています。そして元々のレコードは無くなり、新しいレコードは生成されていません。

db/seeds.rbの属性名をnameからitem_nameに変更してターミナルでseedを実行すれば、データを生成することができます。

まとめ

  • DBの中身を削除する方法は色々ある
  • delete_allメソッドでは、レコードを削除するがリセットはされない
  • db:resetはDBをリセットしてseedまで実行
  • de:migrate:resetはマイグレーションファイルの変更を読んでくれる