【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分程度経ったあとに再接続すると問題なく表示されました!データもしっかり入ってました!