ぷろぐら×でざいん

Rails migrationの書き方色々

Rails migrationの書き方色々

Rails migrationの書き方色々

前述

Djangoに慣れていると最初はmigrationファイルを手動に作成しなければいないことに慣れませんが、慣れると大変合理的だと思いました。特に下記のように “migrate”と”rollback”の挙動をしっかりと定義できることや、更にmigrationファイルの中にデータ移行を行うことができたりと、意外と便利なのだと勝手に解釈しています。
多分、Djangoの”migrate”でも同じような挙動を行うことはできるはずですが、まだ試してないです。


テーブル名変更

class RenameTable < ActiveRecord::Migration[5.1]
  def up
    rename_table :old_table_name, :new_table_name
  end

  def down
    rename_table :new_table_name, :old_table_name
  end
end

カラム名変更

class RenameColumnName < ActiveRecord::Migration[5.1]
  def up
    rename_column :table_name, :old_column_name, :new_column_name
  end

  def down
    rename_column :table_name, :new_column_name, :old_column_name
  end
end

Referenceの追加・削除

class RemoveRefernce < ActiveRecord::Migration[5.1]
  def up
    remove_reference :table_name, :reference_model_name, index: true, foreign_key: true
  end

  def down
    add_reference :table_name, :reference_model_name, index: true, foreign_key: true, limit: 8  # 参照先がBigIntの場合
  end
end

カラムを追加・削除

class AddColumn < ActiveRecord::Migration[5.1]
  def up
    add_column :table_name, :new_id, :bigint
    add_column :table_name, :new_title, :string
  end

  def down
    remove_column :table_name, :new_id
    remove_column :table_name, :new_title
  end
end

あとがき

Railsの”migrate”の欠点はマイグレーションファイル内に複数の変更がある場合に1つでもエラーで失敗してしまうと全てをロールバックしてくれないのでデータ不整合が起こってしまいます。どうせなら1つのマイグレーションファイルの変更の1つでも失敗したら全てロールバックしてくれれば良いのだけど。。。
私の場合は失敗したら失敗した箇所の前文コメントアウトし、少しずつ変更を適用させた後にロールバックしたりなんかしました。もっと効率の良い方法はないものかしらねー。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です