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

# 背景

* Railsで作成したアプリをHerokuへデプロイ

* コードを修正しpush

* DBに保存されたデータが基で、望み通りの動作がされなかった

* **一旦DBをクリアにしたい**

<br>

# 環境

* macOS Catalina 10.15.6

* ruby 2.6.5

* Rails 6.0.3.4

* MySQL : 5.6.47

* Bootstrap : 4.3.1

* Heroku

<br>

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

```:terminal
% heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```

<br>

# コマンドの解説

それでは各コマンドを分解していきましょう。

## 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] : マイグレーションファイルを実行。テーブルを作成。

(<a href="https://railsguides.jp/active_record_migrations.html#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%A6%82%E8%A6%81">Railsガイド, Active Record マイグレーション</a>)

<br>

いったんここまで。というのも、はじめにDBをリセットしようとしたときは、

```:teminal
% heroku run rails db:migrate:reset
```

としていたからです。

続いて、どうしてこれだけでは動作しなかったのかについてです。

<br>

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

<br>

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

```: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の順にテーブルが作成された）
```

<br>

**無事に、DBのDrop(削除)とCreate(作成)が行われ、
その後にrails db:migrateによりテーブルが作成されました**。

Herokuアプリにアクセスし動作も確認しましたが、問題ありませんでした。

<br>

# まとめ

* Heroku上アプリのDBをリセットするには、別途、環境変数を設定する必要がある

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

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

## 参考

* <a href="https://railsguides.jp/active_record_migrations.html#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%A6%82%E8%A6%81">Railsガイド, Active Record マイグレーション</a>

* Qiita: <a href="https://qiita.com/yusuke_s221/items/cefb1808fdf481e6e445">HerokuのRailsアプリのDBリセット方法</a>