Rails:本番データベースに変更を加える最良の方法
-
03-07-2019 - |
質問
使用中の本番データベースに変更を加える必要があります。いくつかの列を追加するだけです。移行によりdevデータベースに変更を加えました。既存のデータを保持し、操作をあまり混乱させずに運用データベースを更新する最良の方法は何ですか?
これはMYSQLであり、既存のレコードのデータも列に追加する必要があります。 1つの列はデフォルト値(ブール値)を持つことができますが、もう1つの列はタイムスタンプであり、任意の日付が付けられた値を持つ必要があります。行数はそれほど多くありません。
したがって、移行を使用する場合、データを追加する方法と、2つだけを実行するにはどうすればよいですか彼らは代わりにスキーマを使用しました)?
解決
実稼働データベースのスキーマがdevで使用しているものと完全に一致しない状態にあるように聞こえます(完全に明確ではありませんが)。砂の中に線を引き、その製品データベースをより良い状態にします。基本的には、prodデータベースに<!> quot; schema_info <!> quot;が含まれていることを確認してください。 <!> gt;してはいけない<!> lt;本番環境で実行したい。その後、心のコンテンツに移行を追加すると、本番データベースに対して機能します。
スキーマの変更またはデータを追加する移行を作成できたら、実際に注意する必要があることの1つは、移行を使用してデータを追加する場合は、移行自体でモデルを定義する必要があることです。 、このように:
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
これの理由は、将来、何らかのリファクタリング中などにモデルを完全に削除する可能性があるためです。 <!> quot; User.find_by_login ... <!> quot;の行でユーザークラスを定義しない場合移行は大きな痛みである例外をスローします。
他のヒント
私は常にこの手順に従います:
- mysqldumpコマンドでprodデータベースをダンプする
- mysqlコマンドを使用して、dev / testデータベースにダンプを設定します
- dev / testで移行を実行する
- 移行の動作確認
- サーバー上にバックアップを保持して、mysqldumpコマンドでprodデータベースをダンプします(変更された可能性があるため)
- prodでの移行の実行(capristanoを使用)
- テスト移行はprodで機能しました
- ビールを飲む(エラーログを見ながら)
開発環境で使用したのと同じ移行を使用していない理由はありますか?
移行でadd_column
を使用して列を追加しても、破壊的ではありません。<!> quot; ALTER TABLE <!> quot;が生成されます。ステートメント。作成した列に何を入れるかがわかっている場合は、移行内の値を入力できます(行カウントが大きい場合は、時間のかからない方法を選択できます)。
列の定義の削除または変更は、プラットフォームに依存していると思います:一部は列の削除を許可し、一部はコマンドの名前変更、作成、選択、ドロップのシーケンスを実行します。
より具体的にするためには、より多くの情報が必要です。どのような種類の移行を検討しているか、どのプラットフォームで実行しているか、移行の一部として値を設定する必要がありますか?そのようなものは大いに役立ちます-質問を編集するだけで、リストに戻ります。