はじめに
スクールの課題で、タスク管理アプリを作成しているときにマイグレーションファイルに記載している内容が、$ rails db:migrate
してもschemaファイルに反映されないことがあり、マイグレーションの復習も兼ねてアウトプットします。修正や追加等ありましたら、コメントいただけるとありがたいです。
環境
・MacBookAir 13インチ M1(2020)
・OS:Sonoma 14.3
・メモリ:16GB
・Rails: version 6.1.7.6
マイグレーションとは?
データベースの中にテーブルを作成するするために必要なもの。マイグレーションファイルを使用してデータベーススキーマに変更を反映させる仕組みです。RailsのマイグレーションファイルはRubyのプログラムで書き実行します。
テーブルの作成、カラムを追加・削除、インデックスの追加、スキーマに対するあらゆる変更は、都度マイグレーションファイルを作成してスキーマに反映するという流れをとる。したがって、データベーススキーマの変遷の歴史がマイグレーションファイルとして残ります。
※この仕組みの長所は、データベーススキーマの状態を任意の地点まで戻せる点です。例えば、アプリケーションのコードに変更を加えた後、何らかの事情でコードをある地点まで戻したい時、その途中でデータベーススキーマへの変更が行われていたとしても、マイグレーションファイルを参照して、任意の地点まで元に戻すことができます。
作り方は大きく2種類あります。
1. rails g model
コマンドでモデルを作成
rails g model [model名] [属性名1:データ型1] [属性名2:データ型2] ...
このコマンドでモデルを作成すると、対応するマイグレーションファイルが一緒に生成されます。例えば、String型のname属性, Integer型のage属性を持つUserモデルを作成したい場合は、$ rails g model user name:string age:integer
となります。モデルを作成する時、対応するテーブルが必要なことがあらかじめ分かっている場合は、この方法でマイグレーションファイルを作成すると楽。
2. rails g migrate
コマンドでマイグレーションファイルだけを単独で作成
rails g migrate [マイグレーションクラス名]
モデルを作成したあとでテーブルを作成する場合や、テーブル作成以外のマイグレーションファイルが必要な場合はこちらを使うことになります。
マイグレーションを実行
$ rails db:migrate
== 20200713120627 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0203s
== 20200713120627 CreateUsers: migrated (0.0204s) =============================
DBやマイグレーション周りの便利なコマンド集
マイグレーションがどこまで進んでいるか確認
$ rails db:version
#versionを確認する。
# 例:Current version: 20171112122350
# version: 20171112122350実行している場合↑
$ rails db:migrate:status
#migrationの適用状態を表示
ロールバック
$ rails db:rollback
#1つ前のファイルの状態まで戻す。
$ rails db:rollback STEP=○
#現在地を含めた○個前までなかったことにしてくれる
#つまり○+1個前のファイルまで実行された状態
rake db:migrate VERSION=0
#最初のバージョン(0)に戻す場合。VERSIONを指定するとその件数分、戻す。
rails db:migrate:down VERSION=20221003050833
#VERSIONに指定されたmigrationをdownにする
$ rails db:abort_if_pending_migrations
#どのファイルが作られていないか知りたい時。
マイグレーションファイルを作成
$ rails db:migrate
$ rails db:migrate:up VERSION=20221003050833
#VERSIONに指定されたmigrationをupにする
番外編(rails db:reset、rails db:migrate:reset、rails db:setup etc..
)
$ rails db:reset
新しくテーブルを作り直して、さらにシードファイルも読み込んでダミーデータも作ってくれる。新しくテーブルを作り直すので、既存のデータは全て消えて新たにシードファイルを元に作り直す。db:drop、db:create、db:schema:load、db:seedをまとめて実行するコマンド。
$ rails db:migrate:reset
新たにテーブルを作り直すので、テーブルのデータはもちろん全部消える。※ここは、$ rails db:reset
と同じ。
シードファイルは読み込まないので、新しいダミーデータは生成されない。($ rails db:seedは自分で実行する必要がある)
rails db:drop、rails db:create、rails db:migrateをまとめて実行するコマンド。
$ rails db:setup
アプリケーションのDB周りの初期設定をしてくれる。以下3つのコマンドを実行してくれる。
- $ rails db:create
- $ rails db:schema:load
- $ rails db:seed
$ db:drop
DBを削除する。