rails db:seed できなくなった
rails db:seed とは
Railsには、初期データを追加するためのシード機能が備わっており、「seed.rb」ファイルにデータを記述していきます。
例えば、
Customer.create!(
email: "aaa@amail.com",
password: "a12345",
nickname: "れいこ",
profile: "令和生まれの道子です。",
)
こんな感じでCustomersテーブルのそれぞれのカラムにデータを保存(create!)します。
このような記述の集まりが、「seed.rb」ファイルで、それを実行するのが、rails db:seed
というわけです。
エラー
rails db:seedをすると、既にemailがデータベースにあるようで、バリデーションエラーとなりました。
TRY
- x
rails db:reset
rails db:seed
- x
rails db:drop
rails db:migrate
rails db:seed
そもそも
rails db:reset
-
rails db:drop
とrails db:setup
を連続して行うコマンド
rails db:drop
- database.ymlの設定に従って、データベースを削除するコマンド
rails db:setup
- 全てのデータベースを作成し、全てのスキーマをロードし、seedデータで初期化するコマンド
-
rails db:create
rails db:schema:load
rails db:seed
を連続して実行するコマンド
rails db:create
- データベースの設定に従ってデータベースを作成するコマンド
rails db:schema:load
- データベーススキーマの最新の状態のキャプチャである「schema.rb」ファイルでデータベースを作成するコマンド
rails db:migrate
- 未実行のマイグレーションファイルを実行するコマンド
つまり
- 1は、
rails db:drop
rails db:create
rails db:schema:load
rails db:seed
rails db:seed
と同じであり、もう既に初期データが追加されたのに、もう一度追加しようとしたわけなので、できるわけないよね〜
- 2は、コマンドはそのままだけど
rails db:drop
した後に、rails db:migrate
しているから、データベースがないところに、マイグレーションファイルを実行しているから、そりゃ無理っしょ、となるのかな。
解決
以下のコマンドで解決しました。
rails db:drop
rails db:create
rails db:schema:load
rails db:seed
↓
rails db:drop
rails db:setup
こちらのサイト
https://eiji-hb.hatenablog.com/entry/2019/12/19/225008
のを見てとりまやってみて解決したのですが、1つ1つ何をしているか見るとどこでなぜコケたのかよく分かりました。
まとめ
- 1つ1つ何を担っているのか知ることが大事
- 問題の切り分けをすることが必要ですね
- ちなみに、今回で言うと、途中「ああああああああ!!」ってなりましたが、
- マイグレーションファイルがおかしい
- データが残っている
の2つに当たりをつけてました。