Ruby on rails 不能回避;ActiveRecord::StatementInvalid:PG::DatatypeMismatch:ERROR:column“的默认值;性别“;无法自动强制转换为整型;

Ruby on rails 不能回避;ActiveRecord::StatementInvalid:PG::DatatypeMismatch:ERROR:column“的默认值;性别“;无法自动强制转换为整型;,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,我正在尝试将rails应用程序中的性别列更改为整数。据说,当使用postgresql时,我们必须以稍微不同的方式编写。i、 e change_column :users, :gender, :integer, using: 'gender::integer' 或 然而,在我的情况下,上述仍然不工作,并得到以下错误 PG::DatatypeMismatch: ERROR: default for column "gender" cannot be cast automatically to t

我正在尝试将rails应用程序中的性别列更改为整数。据说,当使用postgresql时,我们必须以稍微不同的方式编写。i、 e

change_column :users, :gender, :integer, using: 'gender::integer'

然而,在我的情况下,上述仍然不工作,并得到以下错误

PG::DatatypeMismatch: ERROR:  default for column "gender" cannot be cast automatically to type integer
: ALTER TABLE "users" ALTER COLUMN "gender" TYPE integer USING gender::integer
请告诉我为什么它不起作用。或者我有一些奇怪的东西?例如打字错误

我的环境

  • Ruby:2.5.0
  • 轨道:5.1.6
  • 博士后:11.1

根据您看到的错误消息,Postgres不知道如何在将数据库类型更改为整数时保留您设置的默认值。我建议:

  • 删除默认值
  • 更改列上的数据类型
  • 在新类型中添加默认值
  • 您可以在同一通话中执行步骤2和步骤3。在向上迁移过程中,您将需要使用类似以下内容:

    def up
      execute "ALTER TABLE users ALTER gender DROP DEFAULT;"
      change_column :users, :gender, :integer, using: 'gender::integer', default: 0
    end
    

    谢谢在我的例子中,首先下拉性别列,然后插入
    change\u列:users,:gender,:integer,默认值:0
    ,它就可以工作了。但是你怎么知道错误表明Postgres不知道如何保持默认值呢?在你发布的错误消息中,
    error:default for column“gender”不能自动转换为integer
    default for column“gender”'引用了列的现有默认值。我不知道该值在数据库上下文中的含义。。。但现在我明白了。谢谢
    def up
      execute "ALTER TABLE users ALTER gender DROP DEFAULT;"
      change_column :users, :gender, :integer, using: 'gender::integer', default: 0
    end