【问题标题】:Rails Migration - PG::Error: ERROR: invalid input syntax for integer: ""Rails 迁移 - PG::Error: 错误:整数的输入语法无效:“”
【发布时间】:2014-03-30 10:19:08
【问题描述】:

我正在尝试将我的代码部署到 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

【问题讨论】:

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


    【解决方案1】:

    该错误告诉您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)"
    

    可能还有其他值无法转换为整数,您必须以类似方式清理它们。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        • 2017-02-28
        相关资源
        最近更新 更多