Подтвердить что ты не робот

Rails & Postgres: Migration to change_colomn дает ошибку "нельзя отбрасывать, чтобы ввести временную метку без часового пояса"

Отключение Rails для перевода столбца времени "deleted_at" в столбец datetime не удалось. Любые идеи о том, как это решить? Это новая установка Postgres, если это актуально.

-- 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
4b9b3361

Ответ 1

Вы не можете изменить тип поля от времени до метки времени ( "datetime" ), потому что значения не могут быть преобразованы - база данных не знает дату.

Однако вы можете удалить и снова создать столбец:

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;

Ответ 2

В Rails это выглядело бы как

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