Rails & Postgres: Migration to change_colomn gives error “cannot be cast to type timestamp without time zone”

前端 未结 2 1753
轻奢々
轻奢々 2021-02-19 20:09

A Rails migration to turn a \"deleted_at\" time column to a datetime column failed. Any ideas on how to solve this? It\'s a fresh install of Postgres if that is relevant.

<
相关标签:
2条回答
  • 2021-02-19 20:33

    You can't alter a field's type from time to timestamp ("datetime"), because the values couldn't be converted -- the database doesn't know the date.

    You can, however, drop and re-create the column:

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

    Or if this field was set to NOT NULL, you should instead do:

    ALTER TABLE products ADD COLUMN deleted_at timestamp NOT NULL;
    

    But if you insist on retaining fake values in this table like Sean, you can use ALTER...TYPE...USING like this:

    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 讨论(0)
  • 2021-02-19 20:57

    In Rails this would look something like

    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
    
    0 讨论(0)
提交回复
热议问题