背景
-
Railsで作成したアプリをHerokuへデプロイ
-
コードを修正しpush
-
DBに保存されたデータが基で、望み通りの動作がされなかった
-
一旦DBをクリアにしたい
環境
-
macOS Catalina 10.15.6
-
ruby 2.6.5
-
Rails 6.0.3.4
-
MySQL : 5.6.47
-
Bootstrap : 4.3.1
-
Heroku
方法
まず、結論から。
今回はアプリのディレクトリ上で、ターミナルに以下のコマンドを入力しました。
% heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
コマンドの解説
それでは各コマンドを分解していきましょう。
heroku run
Heroku上でコマンドを実行する際に用いる
rails db:migrate:reset
rails db:reset + rails db:migrate
-
[rails db:reset] : DBを削除し再度設定(rails db:drop + rails db:create)
-
[rails db:migrate] : マイグレーションファイルを実行。テーブルを作成。
(Railsガイド, Active Record マイグレーション)
いったんここまで。というのも、はじめにDBをリセットしようとしたときは、
% heroku run rails db:migrate:reset
としていたからです。
続いて、どうしてこれだけでは動作しなかったのかについてです。
heroku run rails db:migrate:reset だけで動作しない理由
このやり方では下記の通りエラーが発生します。
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
これをGoogle翻訳に突っ込んで和訳すると、
ActiveRecord :: ProtectoredEnvironmentError:「本番」データベースに対して破壊的なアクションを実行しようとしています。
続行することが確実な場合は、環境変数を使用して同じコマンドを実行します。
DISABLE_DATABASE_ENVIRONMENT_CHECK = 1
どうやら本番環境(Herokuアプリ上)でrails db:dropを実行しようとしたところ、
「一旦止めます。本当に大丈夫ならDISABLE_DATABASE_ENVIRONMENT_CHECK = 1を設定してください」と注意喚起を受けているようですね。
というわけで、おとなしく環境変数を追加してみましょう。
(これが今回のゴールです。)
% heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
[結果]
Dropped database 'heroku_***'
Created database 'heroku_***'
-- create_table(:users)
(9.6ms) CREATE TABLE `users` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `nickname` varchar(255) NOT NULL, `email` varchar(255) DEFAULT '' NOT NULL, `encrypted_password` varchar(255) DEFAULT '' NOT NULL, `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL)
-> 0.0106s
-- add_index(:users, :email, {:unique=>true})
(17.2ms) CREATE UNIQUE INDEX `index_users_on_email` ON `users` (`email`)
-> 0.0240s
-- add_index(:users, :reset_password_token, {:unique=>true})
(16.6ms) CREATE UNIQUE INDEX `index_users_on_reset_password_token` ON `users` (`reset_password_token`)
-> 0.0250s
== 20201019062002 DeviseCreateUsers: migrated (0.0600s)
(以下、tasks/commits/messages/permissionsの順にテーブルが作成された)
無事に、DBのDrop(削除)とCreate(作成)が行われ、
その後にrails db:migrateによりテーブルが作成されました。
Herokuアプリにアクセスし動作も確認しましたが、問題ありませんでした。
まとめ
-
Heroku上アプリのDBをリセットするには、別途、環境変数を設定する必要がある
-
heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
動作がうまくいかないときはターミナルを見ると解決できることが多いと、改めて感じました。