私が Rails を学習していたときは「マイグレーション」というものがよくわかっていませんでした。
マイグレーションを理解するにはデータベースの知識も必要であるため、説明できるほど理解できている方は少ないのではないでしょうか?
この記事ではマイグレーションについて分かりやすく初心者向けに解説しつつ、よくある誤解・間違いと対処方法についてもお伝えします。
この機会にマイグレーションについて理解を深め、他の方に説明できるぐらいまで習得しましょう!
Rails マイグレーションとは
「マイグレーション」とは、データベースの状態を変更するための仕組みのことを指します。
データベースの「状態」とは、どのようなデータを保存するための「箱」(テーブル)があるか、その「箱」の中にはどのような「仕切り」(カラム)があるかといったことを指します。
なぜRailsマイグレーションを学ぶべきなのか?
ウェブサイトやアプリケーションを作る際、私たちはたくさんの情報を管理しなければなりません。
ユーザーの情報、商品の情報、注文の履歴など、これら全ての情報をきちんと管理するためには、データベースが必要となります。
しかし、プロジェクトが進むにつれて、必要な情報は変わることがあります。
新しい情報を保存するためには新たな「箱」や「仕切り」を追加する必要がありますし、不要になったものは削除する必要があります。
このようにデータベースの構造を変更する作業が「マイグレーション」です。
そして、この「マイグレーション」を効率良く行うためのツールが、Railsには用意されています。
つまり、Railsマイグレーションを学ぶことで、データベースの変更作業を簡単に、そして間違いなく行うことができます。
Railsマイグレーションの現場での重要性
現場では、Railsマイグレーションは非常に重要なツールとなります。
開発チームの中で複数人が同じプロジェクトを扱っているとき、データベースの状態は常に同じである必要があります。
そうでないと、一部の開発者だけが使用できる機能ができてしまったり、逆に一部の開発者だけが機能をテストできなくなってしまう可能性があります。
Railsマイグレーションを使用することで、全員が同じデータベースの状態で開発を進めることができます。そのため、開発効率が向上し、バグを未然に防ぐことができます。
また、Railsマイグレーションは、「何を」「いつ」変更したのかという履歴を残すことも可能です。これにより、何か問題が発生したときに、原因を特定しやすくなります。
Rails マイグレーションの基礎
では、具体的にRailsマイグレーションはどのように行うのでしょうか。まずは基本的な流れと、マイグレーションファイルの作成方法から見ていきましょう。
Railsマイグレーションファイルとは
Railsマイグレーションを行うためには、まずマイグレーションファイルを作成します。
このファイルは、Railsがデータベースの変更をどのように行うべきかを知るための「設計図」のようなものです。
このマイグレーションファイルは、特別なコマンドを使用して生成します。
そして、このファイルに変更内容を書き込むことで、Railsが自動的にデータベースを更新してくれます。
Railsマイグレーションファイルの作成
では、まずマイグレーションファイルを作成してみましょう。
以下に示すのは、新たに「users」テーブルを作成するためのマイグレーションファイルを作成するコマンドです。
rails generate migration CreateUsers
これを実行すると、新たなマイグレーションファイルが作成されます。
このファイルは「db/migrate」ディレクトリの中に保存されます。
具体的な作成手順とコード例
作成したマイグレーションファイルを開くと、以下のようなコードが書かれています。
class CreateUsers < ActiveRecord::Migration[6.0]
def change
end
end
ここに、具体的なテーブル作成の指示を書きます。
例えば、ユーザーの名前とメールアドレスを保存するためのテーブルを作成する場合、以下のように書きます。
class CreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps
end
end
end
このようにすると、name
とemail
という名前の「仕切り」を持つusers
テーブルが作成されます。
また、t.timestamps
により、各データの作成日時と更新日時を自動的に記録するための「仕切り」も作成されます。
そして、このマイグレーションファイルを以下のコマンドで実行することで、データベースにこのテーブルが作成されます。
rails db:migrate
Railsマイグレーションファイルの変更
次に、作成したマイグレーションファイルを変更する方法を見ていきましょう。
マイグレーションファイルを変更するとは、既存のテーブルに「仕切り」を追加したり、削除したりすることを指します。
具体的な変更手順とコード例
例えば、既存のusers
テーブルに、新たにage
という「仕切り」を追加する場合、以下のコマンドで新たなマイグレーションファイルを作成します。
rails generate migration AddAgeToUsers
生成されたマイグレーションファイルに、以下のように追加したい「仕切り」の情報を書きます。
class AddAgeToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :age, :integer
end
end
これで、users
テーブルにage
という「仕切り」が追加されます。
このマイグレーションファイルを以下のコマンドで実行することで、データベースにこの変更が反映されます。
rails db:migrate
Railsマイグレーションファイルの削除
最後に、マイグレーションファイルを削除する方法を見ていきましょう。
マイグレーションファイルを削除するとは、テーブル自体を削除する、またはテーブルから「仕切り」を削除することを指します。
具体的な削除手順とコード例
例えば、users
テーブルから、不要になったage
という「仕切り」を削除する場合、以下のコマンドで新たなマイグレーションファイルを作成します。
rails generate migration RemoveAgeFromUsers
生成されたマイグレーションファイルに、以下のように削除したい「仕切り」の情報を書きます。
class RemoveAgeFromUsers < ActiveRecord::Migration[6.0]
def change
remove_column :users, :age
end
end
これで、users
テーブルからage
という「仕切り」が削除されます。
このマイグレーションファイルを以下のコマンドで実行することで、データベースにこの変更が反映されます。
rails db:migrate
これらの手順を経ることで、データベースの状態を自由に変更することができます。
Railsマイグレーションはこのように、データベースを管理する強力なツールです。
Rails マイグレーションの応用
基本的なマイグレーションの流れを理解したところで、次に少し応用的な操作について学んでいきましょう。
特に、カラム追加やマイグレーションのロールバック、やり直しといったテクニックは頻繁に使用します。
Railsマイグレーションでカラム追加
前述した通り、既存のテーブルに新しい「仕切り」を追加するには、新たなマイグレーションファイルを作成し、その中に追加したい「仕切り」の情報を書きます。
次のコマンドは、users
テーブルにphone_number
という「仕切り」を追加するマイグレーションファイルを作成します。
rails generate migration AddPhoneNumberToUsers
そして、以下のように変更を加えます。
class AddPhoneNumberToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :phone_number, :string
end
end
このマイグレーションを適用するには、以下のコマンドを実行します。
rails db:migrate
これで、users
テーブルにphone_number
という「仕切り」が追加されました。
Railsマイグレーションのロールバック
マイグレーションによるデータベースの変更を取り消す、つまり「元に戻す」操作をロールバックと呼びます。
ロールバックは、直前のマイグレーションを取り消す操作で、以下のコマンドで行います。
rails db:rollback
ロールバックを行うと、直前に行ったマイグレーションの変更が取り消されます。
例えば、新しい「仕切り」を追加した後にロールバックを行うと、その「仕切り」が削除されます。
Railsマイグレーションのやり直し
特定のマイグレーションをやり直す、つまり「元に戻してから再度実行する」操作をマイグレーションのやり直しと呼びます。
マイグレーションのやり直しは、以下のコマンドで行います。
rails db:migrate:redo
このコマンドを実行すると、直前のマイグレーションが一度ロールバックされ、その後再度マイグレーションが実行されます。
これは、マイグレーションファイルに変更を加えた後、その変更をデータベースに反映するために用いられます。
これで、Railsマイグレーションの基本的な概念と操作方法を学びました。
Railsマイグレーションは、データベースの状態を管理し、適切な状態に保つための重要なツールです。覚えておくと、アプリケーション開発がよりスムーズに進みます。
よくある間違い
Railsマイグレーションを使用する際、初心者によくある間違いとその対策方法について詳く見ていきましょう。
マイグレーションを適切に使いこなすことで、データベース管理が格段に楽になります。
マイグレーションファイルを後から書き換える
マイグレーションファイルは一度実行(マイグレート)されると、その内容がデータベースに反映されます。
しかし、その後でマイグレーションファイルを直接編集しても、その変更はデータベースに反映されません。これはよく見られる初心者の間違いの一つです。
NG例
まず、以下のコマンドでusers
テーブルにname
カラムを追加するマイグレーションファイルを作成します。
rails generate migration AddNameToUsers name:string
これを実行すると、以下のようなマイグレーションファイルが生成されます。
class AddNameToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :name, :string
end
end
このマイグレーションを実行してしまった後で、マイグレーションファイルを直接編集し、name
カラムをusername
カラムに書き換えてしまうと、問題が起きます。
class AddNameToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :username, :string
end
end
このマイグレーションを再度実行しても、データベースにはname
カラムが存在し、username
カラムは存在しません。
OK例
変更を加えたい場合、新しいマイグレーションファイルを作成し、その中で変更を加えます。
それからrails db:migrate
を実行することで、変更内容がデータベースに反映されます。
以下のコマンドで新たにusername
カラムを追加するマイグレーションファイルを作成します。
rails generate migration AddUsernameToUsers username:string
生成されるマイグレーションファイルは以下の通りです。
class AddUsernameToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :username, :string
end
end
このマイグレーションを実行すると、users
テーブルにはname
カラムとusername
カラムが追加されます。
カラム追加の記述をしていない
新しいカラムを追加したい場合、それを明示的にマイグレーションファイルに記述する必要があります。
しかし、初心者の中にはカラム追加の記述を忘れる方もいます。
NG例
たとえば、以下のようにマイグレーションファイルを作成し、カラムの追加を忘れてしまう場合です。
class AddAgeToUsers < ActiveRecord::Migration[6.1]
def change
end
end
このマイグレーションを実行しても、users
テーブルにage
カラムは追加されません。
OK例
カラムを追加するには、マイグレーションファイルにadd_column
メソッドを用いて明示的に記述する必要があります。
例えば、users
テーブルにage
カラムを追加する場合、以下のように記述します。
class AddAgeToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :age, :integer
end
end
このマイグレーションを実行すると、users
テーブルにage
カラムが追加されます。
複数のマイグレーションファイルで同じ変更をしている
複数のマイグレーションファイルで同じカラムを追加したり、同じテーブルを作成したりすることは避けましょう。これを行うと、2回目のマイグレーション実行時にエラーが発生します。
NG例
以下のように、2つのマイグレーションファイルで同じusername
カラムをusers
テーブルに追加しようとすると、問題が起きます。
最初のマイグレーションファイル:
class AddUsernameToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :username, :string
end
end
2つ目のマイグレーションファイル:
class AddAnotherUsernameToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :username, :string
end
end
2つ目のマイグレーションを実行しようとすると、以下のようなエラーが発生します。
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: duplicate column name: username
これは、users
テーブルにすでにusername
カラムが存在するためです。
OK例
同じ名前のカラムを追加するのではなく既存のカラムを変更するか、別の名前のカラムを追加するようにしましょう。