0

MySql DB で Rails アプリを実行しています。

移行を統合する方法はありますか? 例えば:

と呼ばれる非常に大きなテーブルがあり、そのテーブルにmembers列を追加する移行を作成しname、後で別のフィールドaddressを追加してフィールドにインデックスを追加する別の移行を作成するとしaddressます。

今すぐ移行を実行すると、テーブルが 3 回変更されます: add name、 add address、および add index 。そのたびに、alter table コマンドは実際に新しいテーブルを作成し、すべてのデータをそこにコピーして、古いテーブルを削除します。

私の場合、membersテーブルは非常に大きく、1,000 万を超えるレコードがあるため、各変更には数時間かかります。

変更を 1 つの変更に統合する方法はありますか?

4

2 に答える 2

2

移行ごとに 1 つの操作に制限されていないため、質問を理解するのは少し難しいです。

あなたは簡単に行うことができます:

class AddNameAddressAndIndexToMembers < ActiveRecord::Migration
  def up
    change_table :members do |t|
      t.string :name
      t.text :address
      t.index :name
    end
  end

  def down
    change_table :members do |t|
      t.remove_index :name
      t.remove :name, :address
    end
  end
end

移行を元に戻し、以前の移行ファイルを削除し、この移行を実行するだけで、すべてうまくいくはずです。

これらが古い移行であることを意味する場合は、大量の移行を元に戻したくないため、注意が必要です。しかし、あなたは何を達成したいですか?デプロイのみが必要な場合は、rake db:schema:dump および rake db:schema:loadで現在のschema.rbを使用します。

于 2011-10-03T23:36:32.180 に答える
1

本当に速度を最大化したい場合は、実行呼び出しで SQL を展開することを検討する必要があります。これにより、たとえば、目的の構造で一時的な結果セットを作成し、既存のテーブルを空にする、削除する、および/または変更することができます。一時的な結果セットからそのテーブルを再設定します。

class SQLRevisions < ActiveRecord::Migration
    def change
        execute "
            [SQL PROCESS CALL]
            [SQL PROCESS CALL]
            [ETC.]"
        end
    end

意図した結果を得るために移行をローカルでテストしてから、本番インスタンスで実行します。

于 2012-09-10T21:32:27.707 に答える