【Rails】マイグレーション作成・変更・削除・やり直し方法を解説!間違えたときの対処法も

当サイトでは一部リンクに広告が含まれています
アイキャッチ

私が 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

このようにすると、nameemailという名前の「仕切り」を持つ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例

同じ名前のカラムを追加するのではなく既存のカラムを変更するか、別の名前のカラムを追加するようにしましょう。

目次