Rails & Postgres: переход на change_colomn приводит к ошибке "невозможно привести к метке времени без часового пояса" - PullRequest
10 голосов
/ 02 апреля 2011

Миграция Rails для превращения временного столбца «Удаленный_кат» в столбец даты и времени завершилась неудачно.Есть идеи, как это решить?Это свежая установка 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

Ответы [ 2 ]

10 голосов
/ 16 октября 2014

В 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
7 голосов
/ 02 апреля 2011

Вы не можете изменять тип поля время от времени («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;

Но есливы настаиваете на сохранении в этой таблице ложных значений, таких как Шон, вы можете использовать ALTER ... TYPE ... USING так:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...