11

使用中の本番データベースに変更を加える必要があります。いくつかの列を追加するだけです。移行を使用して開発データベースに変更を加えました。既存のデータを保持し、運用をあまり中断せずに、運用データベースを更新する最善の方法は何ですか?

それはMYSQLであり、既存のレコードについても列にデータを追加する必要があります。1 つの列はデフォルト値 (ブール値) を持つことができますが、もう 1 つの列はタイムスタンプであり、任意の過去の値を持つ必要があります。行数はそれほど多くありません。

したがって、移行を使用する場合、データを追加する方法と、2 つ (または 3 つ - データを追加する - 移行によって最初に構築されていない本番データベースでの最新の移行) を実行するにはどうすればよいですか (彼らは代わりにスキーマ)?

4

4 に答える 4

14

私はいつも次の手順に従います。

  • mysqldump コマンドで prod データベースをダンプする
  • mysql コマンドを使用して、dev/test データベースにダンプを入力します。
  • 開発/テストで移行を実行する
  • 移行が機能したことを確認する
  • サーバーにバックアップを保持する mysqldump コマンド (変更されている可能性があるため) を使用して prod データベースをダンプします。
  • prod で移行を実行する (capristano を使用)
  • テスト移行は製品で機能しました
  • ビールを飲む(エラーログを見ながら)
于 2008-10-16T05:19:59.223 に答える
6

実稼働データベースのスキーマが開発で使用しているものと正確に一致しない状態にあるようです (ただし、完全には明確ではありません)。私は砂に線を引き、その製品データベースをより良い状態にします。基本的にやりたいことは、本番環境で実行したくない移行をリストする「schema_info」テーブルが prod db にあることを確認することです。次に、心のコンテンツに移行を追加すると、本番データベースに対して機能します。

それが完了したら、スキーマの変更やデータを追加するマイグレーションを作成できますが、注意が必要なのは、マイグレーションを使用してデータを追加する場合、次のようにマイグレーション自体の中でモデルを定義する必要があることです。 :

class AddSomeColumnsToUserTable < ActiveRecord::Migration
  class User < ActiveRecord::Base; end
  def self.up
    add_column :users, :super_cool, :boolean, :default => :false
    u = User.find_by_login('cameron')
    u.super_cool = true
    u.save
  end

  def self.down
    remove_column :users, :super_cool
  end
end

これは、将来、リファクタリングなどでモデルを完全に削除する可能性があるためです。「User.find_by_login...」行でユーザー クラスを定義しないと、移行によって例外がスローされ、大きな苦痛を伴います。

于 2008-11-07T16:47:19.223 に答える
4

開発環境で使用したのと同じ移行を使用していない理由はありますか?

于 2008-10-15T18:14:34.153 に答える
2

移行での列の追加はadd_column非破壊的である必要があります。「ALTER TABLE」ステートメントが生成されます。作成した列に何を入れるかがわかっている場合は、移行中に値を入力できます (行数が多い場合は、時間のかからない代替手段を選択できます)。

列の定義の削除または変更は、プラットフォームに依存すると思います。列をその場で削除できるものもあれば、名前変更-作成-選択-ドロップの一連のコマンドを実行するものもあります。

より具体的に知るには、より多くの情報が必要です: どのような種類の移行を検討しているか、どのプラットフォームで実行しているか、移行の一部として値を設定する必要がありますか? そのようなものは非常に役立ちます-質問を編集するだけで、リストが押し戻されます.

于 2008-10-15T20:32:35.653 に答える