「change_table」で「bulk: true」を使用したマイグレーションの高速化(Rails)
【結論】
・Rails のマイグレーションで使用されるchange_table
メソッドには、bulk: true
のオプションを設定できる
・このオプションにより、ALTER TABLE
クエリにまとめてくれる
・このオプションは MySQLとPostgreSQLのみサポートされていている
【目次】
【本題】
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) =====================
この様に、マイグレーションを高速化することが可能です。
なお、サポートされているのは、MySQLとPostgreSQLのみとなっています。
参考情報
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/