2011-04-02 21 views
10

將「deleted_at」時間列變成日期時間列的Rails遷移失敗。有關如何解決這個問題的任何想法?這是Postgres的全新安裝,如果這是相關的。Rails&Postgres:遷移到change_colomn會給出錯誤「無法在沒有時區的情況下鍵入時間戳」

-- change_column(:products, :deleted_at, :datetime) 


PGError: ERROR: column "deleted_at" cannot be cast to type timestamp without time zone 
: ALTER TABLE "products" ALTER COLUMN "deleted_at" TYPE timestamp 

回答

7

不能從時間改變一個字段的類型爲timestamp(「日期時間」),因爲該值不能轉換 - 數據庫不知道的日期。

你可以,但是,刪除並重新創建列:

ALTER TABLE products DROP COLUMN deleted_at; 
ALTER TABLE products ADD COLUMN deleted_at timestamp; 

或者,如果該字段設置爲NOT NULL,則應該這樣做:

ALTER TABLE products ADD COLUMN deleted_at timestamp NOT NULL; 

但是,如果你堅持在像Sean這樣的表中保留假值時,可以使用ALTER ... TYPE ...使用像這樣:

ALTER TABLE products ALTER COLUMN deleted_at TYPE timestamp USING 
    CASE WHEN deleted_at IS NOT NULL THEN timestamp '1970-01-01 00:00:00' END; 
-- Or: 
ALTER TABLE products ALTER COLUMN deleted_at 
    TYPE timestamp USING date '1970-01-01' + deleted_at; 
+0

但是,這也將刪除deleted_at內的所有值。這怎麼可能是解決方案? – 2013-11-09 16:59:04

+0

@OtoBrglez這些值非常無用 - 舊列類型僅存儲*日時間*,而不是*日期*。沒有合理的方法將它們轉換爲日期時間。 – intgr 2014-01-06 10:56:08

+0

這是一個糟糕的解決方案。許多系統使用'deleted_at'來確定產品是否被刪除。刪除列和閱讀有__un-deletion__這些記錄的副作用! – Sean 2016-12-14 23:09:06

9

在Rail這看起來像

class ChangeStatusUpdatedAtToDateTime < ActiveRecord::Migration 
    def up 
    remove_column :bookings, :status_updated_at 
    add_column :bookings, :status_updated_at, :datetime 
    end 

    def down 
    remove_column :bookings, :status_updated_at 
    add_column :bookings, :status_updated_at, :time 
    end 
end 
相關問題