rails db:seed でデータが反映されずにハマりました

プログラミング

rails アプリケーションで初期データを作成する方法として、CSVファイルで作ったデータを反映させる方法があります。

「db/seeds.rb」にコードを書いて、「rails db:seed」を実行すると反映してくれます。

この「rails db:seed」を実行してデータが反映されなくてハマったときの対処法を紹介します。

db/seeds.rb の内容

発注データを作成しようとして、次のようなコードを「db/seeds.rb」に記入しました。

# coding: utf-8

require "csv"

CSV.foreach('db/dbo_T_purchase.csv') do |row|
  Purchase.create(:p_number => row[0],
               :p_code => row[1],
               :p_date => row[2],
               ・
               ・
               ・
               ・
               )
end

csvファイルはキチンとできています(確認済)。

rails db:seed の実行結果

Rails> rails db:seed

Rails> 

エラーが表示されず、正常終了したかのような感じです。
で、確認してみると・・・

Rails> rails c
Loading development environment (Rails 5.2.4.3)
irb(main):001:0> Purchase.all
  Purchase Load (1.6ms)  SELECT  "purchases".* FROM "purchases" LIMIT $1  [["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
irb(main):002:0>

空です。1件も反映されていません。。

対処法

# coding: utf-8

require "csv"

CSV.foreach('db/dbo_T_purchase.csv') do |row|
  Purchase.create!(:p_number => row[0],
               :p_code => row[1],
               :p_date => row[2],
               ・
               ・
               ・
               ・
               )
end   

わかりにくいですが 「テーブル名 .create」のところを 「テーブル名 .create!」に変更してあります。

こうすることによって、validationエラーを返してくれるようになりました。

エラー内容は、カラム名のスペルミスでした(恥)

まとめ

create、save、updateは、validationに失敗した場合にfalseを返すそうです。validationに失敗しても、「rails db:seed」自体はエラーではないので、そのまま正常終了してしまうみたいです。

それに対して、 create!、save!、update!、はvalidationに失敗した場合にActiveRecord::RecordInvalid例外を発生するそうです。そうなると「rails db:seed」も異常終了となり、エラー内容も表示してくれるみたいです。

こんなことで丸々一日ハマってしまいました。確か前回も同じようにハマったような・・

なので、備忘録としてアップしておきます。

コメント