Изменил структуру моей базы данных в процессе разработки, поэтому попытался сбросить развернутую базу данных Heroku.Стер это, но теперь я не могу перенести свою базу - PullRequest
4 голосов
/ 14 декабря 2011

так что мое приложение работало нормально. Я создал новую модель и несколько ассоциаций, сделав все старые данные в моем приложении heroku бесполезными. поэтому я попытался сбросить его и заполнить снова. но я даже не могу перенести свою базу данных в heroku с помощью команды heroku rake db:migrate. Я использую SQLite, но, похоже, моя ошибка связана с Postgres. Я не знаю, что это значит, если что-нибудь

Вот ошибка:

rake aborted!
An error has occurred, this and all later migrations canceled:

PGError: ERROR:  column "to" cannot be cast to type "pg_catalog.int4"
: ALTER TABLE "emails" ALTER COLUMN "to" TYPE integer

Tasks: TOP => db:migrate

Моя миграция:

class ChangeDataTypeForEmailUsers < ActiveRecord::Migration
  def self.up
      change_column :emails, :to, :integer
      change_column :emails, :from, :integer
  end

  def self.down
      change_column :to, :string
      change_column :from, :string
  end
end

В чем проблема? Мое развернутое приложение работало нормально. Я добавил новую модель и решил сбросить развернутую базу данных. Итак, я запустил heroku pg:reset, затем отправил свой код в Heroku. затем попытался перенести базу данных, но это не сработало! Что я сделал? Я пытался понять это в течение последних 4 часов. Я не могу больше думать прямо. Любая помощь будет принята с благодарностью

Ответы [ 2 ]

8 голосов
/ 14 декабря 2011

В дополнение к ответу Хишалва.Если вы не можете использовать «change_column», тогда вы можете пойти окольным путем:

 def self.up
   rename_column :emails, :to, :old_to
   add_column :emails, :to, :integer
   Email.reset_column_information
   Email.all.each {|e| e.update_attribute(:to, e.old_to.to_i) }
   remove_column :emails, :old_to
 end

Это окольный путь, и Email.all.each может быть медленным - но он будет работать и правильно разыгрываться для вас.

Если вы собираетесь использовать его только в prod, то вы можете заменить ruby-updates командой SQL UPDATE, которая выполняет те же действия в базе данных, используя метод приведения, специфичный для POSTGRES.

4 голосов
/ 14 декабря 2011

В соответствии с документацией к герою здесь

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

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

Я также был в этом положении раньше, и я не нашел решения, поэтому мне пришлось создать новый столбец, postgresql кажется чувствительным, когда я подхожу к этой проблеме. Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...