2011-07-24 66 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 

但是我有我的移民認爲像

class DeviseCreateUsers < ActiveRecord::Migration 
    def change 
    change_table(:users) do |t| 
     t.database_authenticatable :null => false 
     t.recoverable 
     t.rememberable 
     t.trackable 
     t.timestamps 
    end 
end 

我該如何讓db:migrate忽略已存在的內容,只更改新的內容和/或新的類型?

我在stackoverflow上看到類似的問題,但沒有回答這個問題。感謝您的回答。

+0

我建議您創建一組遷移以複製現有生產數據庫,這些遷移應該放置在遷移列表的開始位置,此子集中的上次遷移應該包含當前生產模式版本的編號(請參閱'select max(version)來自生產數據庫的schema_migrations)。所有後來的遷移都應該修復。 – taro

+0

感謝提示,這裏的問題是,例如''t.recoverable''會添加我不明確知道的字段。因此需要告訴軌道「只添加缺少的東西」。 – rodrigob

+0

您可以檢查文件db/schema.rb以瞭解架構(包括開發和生產)。 – taro

回答

8

如果您使用的是現有數據庫,那麼您不應該嘗試通過遷移來覆蓋它,您應該複製schema.rb中的現有數據庫,然後從那裏向前遷移,只添加已更改的字段。

+0

我接受此答案爲「答案」。基本上,據我瞭解,Rails不會幫助你處理和現有的數據庫。在「t.recoverable」示例中,「手動」添加字段是不可行的。 所以簡短的回答是:「沒有鐵軌不會處理」。 感謝您的意見和解答。 – rodrigob

0

我採取的一種方法是創建一個新模型(假設您還沒有任何遷移 - 請仔細刪除它們),例如「rails生成模型用戶」。除此之外,生成器爲該模型創建數據庫遷移。當您運行db migrate rails時,rails會創建users表並根據現有數據庫的當前狀態創建一個schema.rb。從此,隨後的遷移將基於schema.rb和所做的任何新更改。

相關問題