Rails迁移 - PG ::错误:错误:整数的输入语法无效:“”

时间:2014-02-27 06:37:22

标签: ruby-on-rails postgresql activerecord ruby-on-rails-4 rails-migrations

我正在尝试将我的代码部署到heroku,我收到了错误

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

2 个答案:

答案 0 :(得分: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)"

可能还有其他值无法转换为整数,您必须同样清理它们。

答案 1 :(得分:0)

此问题的另一个解决方案是创建一个函数。几个小时我一直在努力,所以认为值得发布解决方案。我首先创建一个函数来将列中的所有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);