8
8

More than 3 years have passed since last update.

【Rails/Heroku/MySQL】Heroku上のRailsアプリのDBをリセットする方法

Last updated at Posted at 2020-11-02

背景

  • 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


方法

まず、結論から。
今回はアプリのディレクトリ上で、ターミナルに以下のコマンドを入力しました。

terminal
% 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をリセットしようとしたときは、

teminal
% 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を設定してください」と注意喚起を受けているようですね。


というわけで、おとなしく環境変数を追加してみましょう。
(これが今回のゴールです。)

terminal
% 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

動作がうまくいかないときはターミナルを見ると解決できることが多いと、改めて感じました。

参考

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8