Railsのデータベースコマンドこれさえ見れば問題なし！

## 概要
Railsアプリでデータベースをmigrateする際の有用なコマンドをこの記事にまとめる。

## migrateコマンドまとめ
### ファイル作成コマンド
- マイグレーションファイル作成
`rails g migration クラス名`
```
  $ rails g migration CreateUsers
  Running via Spring preloader in process 310
    invoke  active_record
      create    db/migrate/20220913055401_create_users.rb
```

- モデルファイル作成
`rails g model モデル名`
```
  $ rails g migration User
  Running via Spring preloader in process 315
      invoke  active_record
    identical    db/migrate/20220913055401_create_users.rb
      create    app/models/user.rb
```
本来マイグレーションファイルも作成されますが、元々モデル名に対応するマイグレーションファイルが作成されていた場合、作成はスキップされます。

### データベース作成コマンド
- database.ymlでの設定内容に基づデータベースを作成
`rails db:create`
```
  $ rails db:create
  Created database 'データベース名①'
  Created database 'データベース名②'
```

- database.ymlでの設定内容に基づデータベースを作成及びseedデータを反映
`rails db:setup`
rails db:create と rails db:seed を行う。

### マイグレーション実行コマンド
- 未実行のマイグレーションファイルを実行
`rails db:migrate`
```
  $ rails db:migrate
  == 20220913055401 CreateUsers: migrating ==================
  -- create_table(:users)
  == 20220913055401 CreateUsers: migrated (0.2292s) =========
```

- 指定したマイグレーションファイルまで実行
`rails db:migrate VERSION=20220802084230`
```
  $ rails db:migrate VERSION=20220802084230
  == 20220405101025 ChangeColumnUsers: migrating ====================================
  -- change_column(:users, :age, :integer)
    -> 0.2541s
  == 20220405101025 ChangeColumnUsers: migrated (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================

  == 20220802084230 CreateTests: migrating ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: migrated (0.2880s) ===========================
```

- 指定したマイグレーションファイルのみ実行
`rails db:migrate:up VERSION=20220405103000`
```
  $ rails db:migrate:up VERSION=20220405103000
  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================
```

- 環境毎にマイグレーションを実行
`rails db:migrate RAILS_ENV=◯◯`
RAILS_ENVの値にproduction、testを入力することで、マイグレーションをする環境を替えられる。(デフォルトはdevelopment)
```
  $ rails db:migrate RAILS_ENV=production
  == 20220405101025 ChangeColumnUsers: migrating ====================================
  -- change_column(:users, :age, :integer)
    -> 0.2541s
  == 20220405101025 ChangeColumnUsers: migrated (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================

  == 20220802084230 CreateTests: migrating ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: migrated (0.2880s) ===========================
```

### マイグレーション状況確認コマンド
- マイグレーションファイルの実行状態一覧
`rails db:migrate:status`
```
  $ rails db:migrate:status
  Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220329033155  Create users
   up     20220329034010  Create subjects
   up     20220405101025  Change column users
   up     20220405103000  Change column subjects
   up     20220802084230  Create tests
```

- スキーマのバージョンを調べる
`rails db:version`
```
  $ rails db:version
  Current version: 20220802084230
```

### ロールバックコマンド
- マイグレーションを一つ前の状態に戻す
`rails db:rollback`
```
  $ rails db:rollback
  == 20220802084230 CreateTests: reverting ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: reverted (0.2880s) ===========================

  $ rails db:migrate:status
  Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220329033155  Create users
   up     20220329034010  Create subjects
   up     20220405101025  Change column users
   up     20220405103000  Change column subjects
  down    20220802084230  Create tests
```

- マイグレーションを◯個前の状態に戻す
`rails db:rollback STEP=◯`
```
  $ rails db:rollback STEP=2
  == 20220405103000 ChangeColumnSubjects: reverting ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: reverted (0.2880s) ===========================

  == 20220405101025 ChangeColumnUsers: reverting ====================================
  -- change_column(:users, :age, :integer)
    -> 0.2541s
  == 20220405101025 ChangeColumnUsers: reverted (0.2880s) ===========================

  $ rails db:migrate:status
  Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220329033155  Create users
   up     20220329034010  Create subjects
  down    20220405101025  Change column users
  down    20220405103000  Change column subjects
  down    20220802084230  Create tests
```

- 特定のマイグレーションを未実行に戻す
`rails db:migrate:down VERSION=20220329033155`
```
  $ rails db:rollback STEP=2
  == 20220329033155 CreateUsers: reverting ====================================
  -- create_tables(:users)
    -> 0.2541s
  == 20220329033155 CreateUsers: reverted (0.2880s) ===========================

  $ rails db:migrate:status
  Status   Migration ID    Migration Name
--------------------------------------------------
  down    20220329033155  Create users
   up     20220329034010  Create subjects
  down    20220405101025  Change column users
  down    20220405103000  Change column subjects
  down    20220802084230  Create tests
```

### 再マイグレーションコマンド

- 直前のバージョンのロールバックと再マイグレーションを行う
`rails db:migrate:redo`
```
  $ rails db:migrate:redo
  == 20220802084230 CreateTests: reverting ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: reverted (0.2880s) ===========================

  == 20220802084230 CreateTests: migrating ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: migrated (0.2880s) ===========================
```

- ◯個前のバージョンまでロールバックと再マイグレーションを行う
`rails db:migrate:redo STEP=2`
```
  $ rails db:migrate:redo STEP=2
  == 20220802084230 CreateTests: reverting ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: reverted (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: reverting ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: reverted (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================

  == 20220802084230 CreateTests: migrating ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: migrated (0.2880s) ===========================
```

- 特定のバージョンのみロールバックと再マイグレーションを行う
`rails db:migrate:redo VERSION=20220405103000`
```
  $ rails db:migrate:redo VERSION=20220405103000
  == 20220405103000 ChangeColumnSubjects: reverting ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: reverted (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================
```

### データベースを削除及び初期化コマンド
- データベースを削除
`rails db:drop`
```
  $ rails db:drop
  Dropped database 'データベース名①'
  Dropped database 'データベース名②'
```

- データベースを初期化する
`rails db:reset`
rails db:drop でデータベースを削除後、rails db:setup でseedデータを反映させたデータベースを作成

- データベースを初期化及びマイグレーションを実行
`rails db:migrate:reset`
rails db:drop でデータベースを削除後、rails db:create でデータベースを作成、 rails db:migrate を行う。

## 最後に
改めて今回まとめた事でどういうものが出力できるか理解できました。どこか間違っている所があれば指摘して頂けると嬉しいです。<br>
ここまで読んで下さりありがとうございました〜

## 参考資料
- [Railsドキュメント[マイグレーションの実行]](https://railsdoc.com/page/rails_db_migrate)
- [【Rails】ロールバック(rollback)で何が起こっているか？schema_migrationsとは？意味と役割。UPとDOWNとは?それぞれの使い方](https://prograshi.com/framework/rails/rollback_schema-migrations/)
- [【Rails】ロールバック(rollback)で何が起こっているか？schema_migrationsとは？意味と役割。UPとDOWNとは?それぞれの使い方](https://prograshi.com/framework/rails/rollback_schema-migrations/)
- [Railsガイド/Active Record マイグレーション](https://railsguides.jp/active_record_migrations.html)
- [Rails これどう違うんだっけ DBセットアップコマンド](https://blog.solunita.net/posts/what-is-the-difference-commands-for-db-setup-in-ruby-on-rails/)