Как изменить тип столбца в Heroku? - PullRequest
21 голосов
/ 19 июня 2010

Я пытаюсь выполнить миграцию db: в мой экземпляр heorku, и я получаю сообщение об ошибке.Часто задаваемые вопросы описывают мою ошибку следующим образом:

Невозможно изменить тип столбца

Пример: PGError: ОШИБКА: невозможно преобразовать столбец «verify_at» в тип «date»

Причина: PostgreSQL не знает, как привести все строки в этой таблице к указанному типу.Скорее всего, это означает, что у вас есть целое число или строка в этом столбце.

Решение: проверьте ваши записи и убедитесь, что они могут быть преобразованы в новый тип.Иногда проще просто не использовать change_column, а переименовывать / создавать новый столбец.

Как мне изменить эту миграцию сейчас.Это проблема, которая у меня есть.Для своей таблицы контактов я создал следующее:

  t.string :date_entered

В более поздней миграции я делаю следующее:

 change_column :contacts, :date_entered, :date

Похоже, этот столбец change_column является проблемой.

Должен ли я ... изменить вручную эту миграцию?Есть ли способ очистки данных в моих таблицах (я не знал, что Heroku распознает данные в таблице, потому что я делаю рейк).

Мне, очевидно, нужно изменить это значение, и оноиспользуется во всем моем приложении.Спасибо.

Это то, что я пытаюсь ... мысли?

def self.up
  #change_column :contacts, :date_entered, :date
  #this fails in postgres, so trying the same outcome 

  rename_column :contacts, :date_entered, :date_entered_old
  add_column :contacts, :date_entered, :date
  remove_column :contacts, :date_entered_old
end

def self.down
  add_column :contacts, :date_entered_old
  remove_column :contacts, :date_entered
  rename_column :contacts, :date_entered_old, :date_entered
end

Ответы [ 2 ]

40 голосов
/ 19 июня 2010

Сделайте следующее:

  1. переименуйте столбец A
  2. создайте новый столбец B как дату
  3. переместите данные из A в B
  4. удалить A

Другими словами

def self.up
  rename_column :contacts, :date_entered, :date_entered_string
  add_column :contacts, :date_entered, :date

  Contact.reset_column_information
  Contact.find_each { |c| c.update_attribute(:date_entered, c.date_entered_string) } 
  remove_column :contacts, :date_entered_string
end
1 голос
/ 06 октября 2010

Это модифицированная и протестированная версия решения Симоне Карлетти

class ModifyContacts < ActiveRecord::Migration
  def self.up
    rename_column :contacts, :date_entered, :date_entered_string
    add_column :contacts, :date_entered, :date

    Contact.reset_column_information
    Contact.find(:all).each { |contact| contact.update_attribute(:date_entered, contact.date_entered_string) }
    remove_column :contacts, :date_entered_string
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...