2010-08-21 41 views
23

是否可以將字符串字段更改爲整數而不清除已輸入的數據?Rails將字符串轉換爲整數的遷移?

目前DB結構問題的表是:

create_table :people do |t| 
t.string :company_id 

這可能使用遷移?

我在想,也許在遷移下降舊領域,創建一個新的整數 - 但我擔心這將清除所有已輸入的數據。

感謝,

丹尼

回答

28

不要刪除列,它會清除數據。

但是,您可以嘗試

change_column :people, :company_id, :integer 

而如果company_id所有的值可以轉換爲integer,應該沒事。

如果情況並非如此(即並非所有字符串都可以默認轉換),那麼您可以分兩步進行:1)創建一個新列,然後在某個轉換後加載company_id。 2)放下company_id然後重命名新列。

你應該小心這兩種方法(對於第二種方法更是如此),如果可以的話,你應該首先在數據庫副本上執行。

+0

感謝提高格式化,jigfox – Zaki 2010-08-21 09:43:14

+0

大,謝謝。我想我不必在第一個例子中說明當前類型? – dannymcc 2010-08-21 09:44:59

+2

當我將代碼推送到Heroku時,第一種方法爲我生成錯誤。 PG :: DatatypeMismatch:ERROR:列「company_id」不能自動轉換爲鍵入整數 提示:指定一個USING表達式來執行轉換。 :ALTER TABLE「協作者」ALTER COLUMN「company_id」類型整數 rake中止! StandardError:發生錯誤,此次及以後的所有遷移取消: PG :: DatatypeMismatch:ERROR:列「company_id」不能自動轉換爲鍵入整數 提示:指定一個USING表達式來執行轉換。 – Evolve 2014-04-15 07:43:25

31

不要刪除列,使用此

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 

的「暗示」你的PostgreSQL得到基本上告訴你,你需要確認你要做到這一點,以及數據應該如何轉換。要確認更改,在遷移

+0

這應該是公認的答案 – BananaNeil 2018-02-13 23:21:40

8

其他的答案是正確的使用上面的塊,但你可以採取一步與:using關鍵字:

change_column :people, :company_id, :integer, using: 'company_id::integer'