2011-07-24 38 views
4

新しいRails 3.1アプリケーションを作成しています。 この新しいアプリケーションは、既存のデータベース(これは以前のrails 2アプリケーションで作成されたもの)を再利用したいと思います。既存のデータベース上のRailsの移行

データベース内の既存のデータの一部を再利用する新しいアプリケーション定義モデルを作成しました。

それはクリーンシートデータベース上で実行されるため、開発およびテスト段階ではすべてがうまく動作しますが、生産に展開しようとすると、私のようなメッセージが出ます:私は私の移行を持っているしかし

PGError: ERROR: column "email" of relation "users" already exists 
*** [err :: localhost] : ALTER TABLE "users" ADD COLUMN "email" character varying(255) DEFAULT '' NOT NULL 

は次のように考えています

db:migrateを既存のものを無視し、新しいものや新しいタイプのみを変更するにはどうすればよいですか?

私はstackoverflowで同様の質問を見ましたが、この質問には答えません。あなたの答えをありがとう。

+0

既存の本番データベースを複製するための移行セットを作成することをお勧めします。これらの移行は移行リストの先頭に置く必要があります。このサブセットの最後の移行には、現在の本番スキーマバージョン番号が必要ですプロダクションデータベースのschema_migrationsから)。その後の移行はすべて修正する必要があります。 – taro

+0

ヒントのおかげで、ここでの問題は、例えば、 '' t.recoverable''は私が明示的に知らないフィールドを追加することです。したがって、レールに「欠けているものだけを加える」ように伝える必要がある。 – rodrigob

+0

ファイルdb/schema.rbを検査して、スキーマ(開発と本番環境の両方)について考えてみることができます。 – taro

答えて

8

既存のデータベースを使用している場合は、マイグレーションによって既存のデータベースを上書きしないでください。既存のデータベースをschema.rbにレプリケートし、そこからフォワードをマイグレーションして、変更されたフィールドのみを追加する必要があります。

+0

私はこの答えを "答え"として受け入れています。基本的に、私が理解しているように、Railsはあなたの処理と既存のデータベースを手助けしません。 "手作業で"フィールドを追加することは、前述の 't.recoverable'の例にはありません。 短い答えは、「レールなしでは処理できません」です。 ご意見ありがとうございます。 – rodrigob

0

私が取ったアプローチの1つは、新しいモデルを作成することです(マイグレーションはまだないことを前提に - 慎重に削除すると仮定します)。とりわけ、ジェネレータは、そのモデルのdbマイグレーションを作成します。 db migrate railsを実行すると、railsはusersテーブルを作成し、既存のデータベースの現在の状態に基づいてschema.rbを作成します。その後の移行では、schema.rbと新しい変更が行われます。

関連する問題