データベースのトラブルシューティングについて

# はじめに
テーブルに関する問題は、マイグレーションファイルを設定する時や、Gemの「devise」を導入する際にも、
このマイグレーションファイルに起因する問題がよく起きてしまい、つど苦戦していました。
ここではRailsを使用したデータベースやテーブルに関する問題解決方法を、自身の備忘録としてまとめました。
 

## 目的
- データベースの作り直し方を覚える
- マイグレーションファイルの操作を誤ったときの対処方法を覚える
 

# データベースの作り直し
データベースを作り直さなければいけない状況としては、以下が挙げられます。

- データベースの名称を誤って設定してしまった
- エンコードなどのデータベースの設定を誤ってしまった

このような場合には、データベースを作り直します。
主に2つの方法があります。
 

## データベースを削除する
database.ymlに記載されている、エンコードの設定やデータベース名を誤った状態でデータベースを作成してしまった場合、
一度データベースを削除してから作り直す必要があります。手順は以下のとおりです。
 

### ① データベースを削除する
データベースを削除するためには、`rails db:drop`のコマンドを実行します。

```
% cd ~/projects/データベースを作り直したいアプリケーションのディレクトリ
% rails db:drop
```

このコマンドを実行することで、該当するアプリケーションのデータベースを削除することができます。

### ② database.ymlなどを修正する
データベースを削除できたら、この段階でdatabase.ymlなどを修正します。

### ③ データベースを再度作成する
そして、`rails db:create`のコマンドでデータベースを再度作成します。

```
% cd ~/projects/データベースを作り直したいアプリケーションのディレクトリ
% rails db:create
```

## データベースの削除とマイグレーションファイルの適用を一括で行う方法
データベースの設定は間違っていないものの、再度データベースを作り直し、既存のマイグレーションファイルを適用したい場合があります。
その場合は、`rails db:migrate:reset`のコマンドを実行します。

```
% cd ~/projects/データベースを作り直したいアプリケーションのディレクトリ
% rails db:migrate:reset
```

このコマンドを実行することで、以下の操作を一括で行ってくれます。

- データベースを削除する
- データベースを再度生成する
- 既存のマイグレーションファイルをすべて適用する
 

ただしデータベースを一度削除するため、保存されているデータなどはすべて削除されます。
　

# カラム設定ミスの修正方法
devise導入時のマイグレーションファイルを例に解説します。
deviseを導入している段階でよく修正作業が生じるシチュエーションは以下です。

- カラム名をnicknameとしなければいけないのに、nameとしてしまった
- カラムにオプションを付け忘れてしまった

このような場合は、マイグレーションファイルを修正したり、追加したりしてテーブルの情報を更新する必要があります。
 

## カラムの設定を修正する方法
マイグレーションファイルに記載されたカラムの設定を変更するためには、以下の手順で行います。

① 既存のマイグレーションファイルをロールバックする
② マイグレーションファイルに記載されているカラムの設定を編集する
③ マイグレーションを実行して、データベースに適用する

# テーブルの再作成方法
テーブル名を誤ってしまった場合などに、モデルに紐づくテーブルを作り直したいときがあります。
その場合の手順を解説します。

## テーブルを再作成する手順
### ① 関連するマイグレーションファイルをロールバックする
以下のコマンドで、削除したいテーブルに関連するマイグレーションファイルを削除します。

```
% cd ~/projects/テーブルを作り直したいアプリケーションのディレクトリ
% rails db:rollback
```
なお、マイグレーションファイルが複数存在する場合、繰り返し上記のコマンドを実行してすべてのマイグレーションファイルをdownにする必要があります。

### ② rails d modelのコマンドでモデルを削除する
モデルを作成するときは、`rails g model モデル名`のコマンドを実行しますが、
モデルを削除する場合は、`rails d model モデル名`のコマンドを実行します。

```
% cd ~/projects/テーブルを作り直したいアプリケーションのディレクトリ
% rails d model post
```
 
### ③ rails g modelのコマンドでモデルを再度作成する
上記の手順が正しく行えたら、再度モデルを作成する手順を実行します。
特にテーブル名を誤る時、モデル名も誤っていることが多かったのでここは注意して入力します。

```
% cd ~/projects/テーブルを作り直したいアプリケーションのディレクトリ
% rails g model post
```

### ④マイグレーションファイルを編集し、rails db:migrateを実行する
アプリケーションに求められる仕様のとおりに、マイグレーションファイルを編集します。
マイグレーションファイルが編集できたら、以下のコマンドを実行して、データベースにテーブルの情報を反映します。

```
% cd ~/projects/テーブルを作り直したいアプリケーションのディレクトリ
% rails db:migrate
```

# マイグレーションファイルをUPのまま削除した場合

マイグレーションファイルを削除するときは、必ずロールバックを実行してdownにする必要があります。
しかし、ミスは必ず起こりうるものです。
upのマイグレーションファイルを削除してしまうミスが生じるケースとして、以下があります。

- テーブルを作り直したかったので、手作業でマイグレーションファイルを消してしまった
- テーブルを作り直すために、モデルを削除しようと`rails d model モデル名`のコマンドを実行したが、それと同時にupの状態のマイグレーションファイルが消えてしまった

この問題の対処は、以下の2ステップで行います。

① 誤って削除したマイグレーションファイルに代わる、仮のマイグレーションファイルを作成する
② 仮のマイグレーションファイルをdownにして、削除する

仮のマイグレーションファイルの記述は以下となります。

```ruby:MigrationID_sample.rb
class Sample < ActiveRecord::Migration[6.0]
  def change
  end
end
```

# おわりに
間違いなどございましたら、お手数ですがコメントいただけると幸いです。
よろしくお願いします。

# 参考記事
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%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B