Rails Migration - PG::Error: ERROR: недопустимый синтаксис ввода для целого числа:

Я пытаюсь развернуть свой код на героку и получаю сообщение об ошибке

-- execute("ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)")
PG::Error: ERROR:  invalid input syntax for integer: ""
: ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)
rake aborted!

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

class ChangeDataTypeForLodgesImage < ActiveRecord::Migration
  def change
    execute "ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)"
  end
end

person Arun    schedule 27.02.2014    source источник


Ответы (2)


Эта ошибка говорит вам, что у вас есть пустые строки в столбце lodges.image, и вы не можете преобразовать пустую строку в целое число. Вам придется исправить поврежденные данные перед изменением типа столбца. Исправление зависит от того, какими вы хотите видеть пустые строки; одной из возможностей было бы преобразовать их в NULL:

execute %q{
  update lodges
  set image = null
  where image = ''
}
execute "ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)"

Или, возможно, вы хотите, чтобы пустые строки были нулями:

execute %q{
  update lodges
  set image = '0'
  where image = ''
}
execute "ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)"

Могут быть и другие значения, которые вы не можете преобразовать в целые числа, вам придется очистить их аналогичным образом.

person mu is too short    schedule 27.02.2014

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

CREATE OR REPLACE FUNCTION char_to_integer(char character varying)
  RETURNS integer AS
$BODY$
SELECT CASE WHEN trim($1) SIMILAR TO '[0-9]+' 
        THEN CAST(trim($1) AS integer) 
    ELSE NULL END;

$BODY$
  LANGUAGE 'sql' IMMUTABLE STRICT;

Теперь с синтаксисом USING мы можем решить эту досадную проблему с помощью этой команды.

ALTER TABLE table_name ALTER COLUMN column_name TYPE integer USING char_to_integer(column_name);
person Jeremy Quinton    schedule 26.11.2015