「change_table」で「bulk: true」を使用したマイグレーションの高速化(Rails)

【結論】

Railsマイグレーションで使用されるchange_tableメソッドには、bulk: trueのオプションを設定できる

・このオプションにより、ALTER TABLEクエリにまとめてくれる

・このオプションは MySQLPostgreSQLのみサポートされていている

【目次】

【本題】

change_tableメソッドのオプション:bulk

change_tableメソッドは既存のテーブルを変更する際に使用され、create_tableメソッドと同じ要領で利用できます。

change_table :products do |t|
  t.remove :description, :name
  t.string :part_number
  t.index :part_number
  t.rename :upccode, :upc_code
end

:bulkオプション

change_tableメソッドは、bulk: trueというオプションを設定できます。

これによりALTER TABLEクエリにまとめることができます。

例えば、以下の様なマイグレーションを実行するとします。

class ChangeColumnToPosts < ActiveRecord::Migration[5.2]
  def change
    change_table :posts do |t|
      t.column :column1, :string
      t.column :column2, :string
      t.column :column3, :string
      t.column :column4, :string
      t.column :column5, :string
    end
  end
end

以下がその実行結果です。

== 20190829160054 ChangeColumnToPosts: migrating ==============================
-- change_table(:posts)
   -> 0.6061s
== 20190829160054 ChangeColumnToPosts: migrated (0.6062s) =====================

これに:bulkオプションを設定します。

class ChangeColumnToPosts < ActiveRecord::Migration[5.2]
  def change
    change_table :posts, bulk: true do |t|
      t.column :column1, :string
      t.column :column2, :string
      t.column :column3, :string
      t.column :column4, :string
      t.column :column5, :string
    end
  end
end
== 20190829160054 ChangeColumnToPosts: migrating ==============================
-- change_table(:posts, {:bulk=>true})
   -> 0.1273s
== 20190829160054 ChangeColumnToPosts: migrated (0.1274s) =====================

この様に、マイグレーションを高速化することが可能です。

なお、サポートされているのは、MySQLPostgreSQLのみとなっています。

参考情報

change_table (ActiveRecord::ConnectionAdapters::SchemaStatements) - APIdock

Class: RuboCop::Cop::Rails::BulkChangeTable — Documentation for rubocop (0.61.1)

https://aaronlasseigne.com/2012/06/05/faster-activerecord-migrations-using-change-table-bulk/