ヨージとプログラミング

プログラミング勉強の記録

【Rails】本番環境(heroku)へのseedの流し込みでハマったのでメモ

主なエラーはfaker関係

いくつものエラーが出ましたが、発端はfakerというgemです。説明不要かもしれませんが、fakerを使用すれば色々なフェイクデータを生成することができます。
私の場合は以下のように、ユーザー名に使用しています。
2行目のFaker::Name.nameでありそうな名前を生成します。

50.times do |n|
  name = Faker::Name.name
  email = "examples-#{n+1}@example.com"
  height = r.rand(150.0..185.0).round(1)
  password = 'password'
  User.create!(
    name: name,
    email: email,
    height: height,
    password: password,
    password_confirmation: password
  )
end

このコードで開発環境では問題なくフェイクデータを量産しましたが、本番環境(heroku)にseedデータを流し込もうとするとNameError: uninitialized constant Fakerエラーに!
このエラーはFaker定数がおかしいよということなので、fakerが上手く動いていないようです。

herokuにfakerが入っているか確認

とりあえずちゃんとfakerがインストールされていないことにはどんな対策も意味がないので確認してみました。
heroku run gem list でインストール済みgemの一覧を確認。するとfakerの文字が見当たらず。。。インストールされていませんでした。
そこでGemfileを確認すると、fakerが開発環境のみに設定されていることに気づく。

group :dvelopment do
  gem 'faker'
end 

gem fakerをgroupの外に出してあげてbundle install
その後、再びseedデータを流し込む

$ heroku run rake db:seed
=> ActiveRecord::RecordInvalid: Validation failed: Email has already been taken

するとまた別のエラーに...Emailがすでに存在していると言ってますね。少しググりましたが明確な解決法とは出会えず。

herokuのDBリセットしようとしてエラーに

エラーが一向に解消されないので、一旦herokuのdbをリセットすることにしました。

$ heroku run rake db:migrate:reset
=> rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1

するとまた違うエラーが出ました。しかしこれは簡単で、Rails5からはDBの削除などの破壊的な操作の場合にはDISABLE_DATABASE_ENVIRONMENT_CHECK=1を設定する必要があるとのこと。

$ heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1

これで上手くいきました。

再びseedデータの流し込みを試みるが…

DBリセット後にすぐにheroku run rake db:seedしましたが、相変わらずNameError: uninitialized constant Fakerエラーに。
そこで唐突にgit push herokuしてないことに気づく!!!
結局これが一番大きな原因でした。種を明かせばアホな話ですが、私の他にもうっかりさんがいると信じ公開します!

seedの流し込み中に最後のエラー

うっかりも修正し、いざseedを生成しました。

$ heroku run rake db:seed
=> [2019-09-14T08:43:32.312497 #4] DEBUG -- :   Record Create (3.1ms)  INSERT INTO `records` (`weight`, `created_at`, `updated_at`, `user_id`) VALUES (92.55477196151091, '2019-07-19 18:12:46', '2019-09-14 08:43:32', 202)
              〜
D, [2019-09-14T08:43:33.949615 #4] DEBUG -- :    (2.9ms)  BEGIN
D, [2019-09-14T08:43:33.954126 #4] DEBUG -- :   Record Create (3.2ms)  INSERT INTO `records` (`weight`, `created_at`, `updated_at`, `user_id`) VALUES (63.08548370551564, '2019-09-07 14:05:41', '2019-09-14 08:43:33', 12)
D, [2019-09-14T08:43:33.958015 #4] DEBUG -- :    (3.5ms)  COMMIT
D, [2019-09-14T08:43:33.961904 #4] DEBUG -- :    (3.7ms)  ROLLBACK
rake aborted!
ActiveRecord::StatementInvalid: Mysql2::Error: User 'b263fac7d3146c' has exceeded the 'max_questions' resource (current value: 3600): ROLLBACK

途中までは順調にデータが生成されていましたが、しばらくするとエラーが

ActiveRecord::StatementInvalid: Mysql2::Error: User 'b263fac7d3146c' has exceeded the 'max_questions' resource (current value: 3600):

とありますね。これは(herokuの?)無料枠での時間あたりの書き込み回数のmaxに達したためのエラーのようです。試しにheorku openしてみるとサーバーエラー500で開けませんでした。
さてどう解決しようかと思いましたが、どうやら待ってれば良いそうで、10分程度経ったあとに再接続すると問題なく表示されました!データもしっかり入ってました!
f:id:yoji4910:20190914184331p:plain