プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Ruby on Rails】マイグレーション、マイグレーションファイルの書き方
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Ruby on Rails】マイグレーション、マイグレーションファイルの書き方

11.30

  • miyabisan2
  • コメントを書く

この記事は4分で読めます

Railsのマイグレーションについては下記の記事でも少し解説させて頂きました。

【Ruby on Rails】の「O/Rマッパー」である「ActiveRecord(アクティブレコード)」、Scaffoldingで雛形アプリ作成まで

マイグレーションの実行や取り消しにはマイグレーションファイルに書かれた操作を適用する必要があります。

そもそもマイグレーションファイルとは?

RailsにおいてDBへの変更を複数の開発者がストレスなくシェアすることを目的とする仕組みです。

基本的には過去のマイグレーションファイルはいじってはいけない。

例えば、新しいモデルを作成してその後カラムを追加したいとなったとしても過去のモデルを作成するマイグレーションファイルに追加すると言ったことは基本的にしてはいけないです。マイグレーションの思想としてはファイル自体の美しさというよりも過去の履歴をしっかり管理することにあるのです。

マイグレーションファイルが多くなってきたら

マイグレーションファイルは過去の履歴を積み重ねるので多くなってきます。マイグレーションを当てるのに時間がかかったりコードを探し辛くなるというデメリットがあるのでSquasherというgemを使って複数ファイルを集約することを検討しましょう。

マイグレーションのバージョンは管理されている

1つのマイグレーションファイルが1つのバージョンとして扱われます。マイグレーションを適用すればDBスキーマのバージョンを一つあげることができ、適用ずみのマイグレーションを一つ取り消すことでバージョンを一つ下げることができます。

これはRailsのデータベース内に作成される「schema_migrations」というテーブルを通じてどのマイグレーション(バージョン)が適用されているかのデータが保存されます。

rails db:migrate

バージョンを上げる際のコマンドです。「rails migrateコマンド」は仮に適用していないマイグレーションがあった場合も適用されていないマイグレーションだけ選んで適用してれます。

rails db:rollback

一つバージョンを下げる際のコマンドです。

rails db:rollback STEP=N

回数を指定してN個前のバージョンを下げる際のコマンドです。

rails db:reset

全てキャンセルします。

rails db:migrate:reset

全てキャンセルして、新たにマイグレーションをし直します。

マイグレーションのリリース時の注意

マイグレーションをリポジトリに入れる際は、バージョンアップだけでなくロールバックもできることを確認して入れるようにしましょう。

  • 「rails db:migrate」で自分の書いたマイグレーションが期待通り動作するかチェックする。
  • 「rails db:migrate:redo」で自分の書いたマイグレーションがバージョンを下げる際にトラブルが発生しないか確認する。

rails db:migrate:redo

バージョンを下げた後にもう一度上げてくれるので、バージョンを戻す処理が想定どおりに動作しているかを簡単に確認することができます。実行後は手元の環境は最新の環境になっているので問題ないことを確認次第すぐに次の工程に移ることができます。

マイグレーションは環境ごとに適用する必要がある

マイグレーションコマンドは下記になりますが、この場合は開発用DBに対してマイグレーションが適用されます。

1
rails db:migrate

それぞれの環境で適用させたい場合は下記のように指定します。

本番環境

1
rails db:migrate RAILS_ENV=production

テスト環境

1
rails db:migrate RAILS_ENV=test

サーバー上で直接DBをいじった場合

緊急時とかにはDBを直接操作することもあるかもしれません。(カラムにインデックスを加える等)、その場合は後からでも良いので必ずその作業に対応するマイグレーションファイルを作成するようにしましょう。

マイグレーションファイルの名前は一意にすること

マイグレーションファイルの名前はアプリ内で一意にする必要があります。テーブルの新規作成は通常は一回しかないので被らないでしょうがカラムの追加等は何度も発生する可能性があるのでマイグレーションファイルの命名には気を配る必要があります。

テーブルの新規作成

Createテーブル名

カラムの追加

Addカラム名Toテーブル名

db/schema.rb

Railsのデータベース構造がマイグレーションコマンド実行時に自動出力されます。

ロールバックできないケース

マイグレーションのロールバックができないケースもあります。

  • カラムを削除してしまったため元のデータに戻せないケース

対処方法

カラムはロールバックするがデータの復活は行わない。

データを用意しなくても開発上支障がない場合はこの選択肢はありです。また、支障がある場合でも仮のデータを用意すると言ったことを行う方法もありです。

ロールバックを禁止する。

ロールバック処理の中で「ActiveRecord::IrreversibleMigrationエラー」をraiseしてロールバックを禁止します。つまりDBの状態を以前の状態に戻すことを諦める場合に使用します。

ロールバックは禁止にしないが何もしない。

これは元々のデータがミスで新しいデータが正しい場合に選択する方法になります。

テーブルの作成

自動生成コマンド

モデルの生成コマンドを実行した際に自動でマイグレーションファイルも作成されます。

1
rails g model モデル名 カラム名:データ型(string等)

マイグレーションファイルの書き方

マイグレーションファイルのメソッド

changeメソッド

テーブルの新規作成や修正をするためのメソッドです。up/downと異なりロールバックを自動で反転して行ってくれるのでロールバック処理を記述する必要がありません。(add_columnでカラムを追加した後は反転してremove_columnでカラムを削除してくれます。)

upメソッド

マイグレートした際に実行される処理です。ここに記述した内容はdownメソッドで元に戻るようにしておきます。

downメソッド

ロールバックした際に実行される処理です。upで変更したものが元に戻るようにしておきます。

changeメソッドとup/downメソッドの使い分け

  • 「カラムを追加したい場合」はchangeメソッドを使用し「カラムを削除したい場合」はup/downメソッドを使います。

理由

delete_columnでカラムを削除する場合は型情報(文字か数値か不明)を保持していないので、changeメソッドでは自動で反転してカラムを追加するというロールバック処理を行うことができません。その場合はup/downメソッドを使用するようにします。

メソッドの中身

1
2
3
4
5
6
7
    create_table :comments do |t|
      t.references :カラム1, foreign_key: true
      t.string :カラム2
      t.text :カラム3
 
      t.timestamps
    end

t.references :カラム1, foreign_key: true

外部キーであることを示します。

下記コマンドを実行することで自動生成することができます。

1
rails g model モデル名 カラム名:references

t.text :カラム名, null:false

カラムを「NOT NULL制約」とすることができます。

ユニークキー制約

下記のように指定することで指定したカラムはユニークキー(一意制約)を設定することが可能です。

1
2
3
4
5
6
  def change
    create_table :users do |t|
    各カラムの情報
    end
    add_index :users, :ユニークにしたいカラム名, unique: true
  end

カラムの追加及び削除

自動生成コマンド

1
rails g migration マイグレーションファイル名 追加や削除するカラム:データ型

マイグレーションファイルの書き方

追加

1
2
3
  def change
    add_column :モデル名(users等), :追加するカラム名, :データ型
  end

削除

1
2
3
  def change
    remove_column :モデル名(users等), :削除するカラム名(admin等), :データ型(boolean等)
  end

スポンサーリンク
  • 2019 11.30
  • miyabisan2
  • コメントを書く
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2020 11.29

    【Ruby on Rails】「ActiveModel」、「フォームオブジェクト」、「EachValidator」、「単一テーブル継承(STI)」

  2. 2019 12.01

    【Rspec】System Spec(システムスペック)の基本

  3. 2020 12.19

    【Ruby on Rails】「アソシエーション(has_one)」、「belongs_to」のオプション

  4. 2019 12.23

    【Docker】Ruby on Railsのコンテナを作成して起動するまで。

  5. 2020 11.16

    【Ruby on Rails】「cocoon」について

  6. 2019 12.08

    【Ruby on Rails】YarnでのJavaScriptパッケージ管理

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Ruby on Rails】パーシャルを使ったビュー…

【Web開発】ユーザー管理機能の設計や実装、認証設計の…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー