使用迁移更改表列的默认值

Posted

技术标签:

【中文标题】使用迁移更改表列的默认值【英文标题】:Change the default value for table column with migration 【发布时间】:2017-07-28 20:20:02 【问题描述】:

我尝试将默认列值从 false 更改为 true。但是当我运行rake db:migrate VERSION=904984092840298 时,出现以下错误。

StandardError: An error has occurred, this and all later migrations canceled:

PG::InvalidTextRepresentation: ERROR:  invalid input syntax for type boolean: "---
:from: false
:to: true
"
: ALTER TABLE "plussites" ALTER COLUMN "hide_season_selector" SET DEFAULT '---
:from: false
:to: true
'

迁移

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, from: false, to: true 
  end
end

【问题讨论】:

【参考方案1】:

您必须检查您使用的是哪个版本的 ActiveRecord。根据您的命令rake db:migrate,您仍在使用 rails 4.2 或更早版本。

如果您使用的 ActiveRecord 最高为 4.2 (change_column_default 4.2.9),则没有 from/to 选项,您只能将新的默认选项定义为 param。

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, true 
  end
end

上述解决方案不允许回滚,因为该方法不知道之前的默认值是什么。这就是为什么你必须定义一个单独的 up 和 down 方法:

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
  def up
    change_column_default :plussites, :hide_season_selector, true
  end

  def down
    change_column_default :plussites, :hide_season_selector, false
  end
end

如果您使用的是 Rails 5 或更高版本,则可以通过 from/to (change_column_default 5.0.0.1) 定义之前的值和之后的值。在 Rails 5 上,您可以使用您选择的解决方案:

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, from: false, to: true 
  end
end

我希望这个解释能帮助在其他答案下使用 cmets 的人。

【讨论】:

【参考方案2】:

这很奇怪,因为根据文档 (change_column_default),您的代码应该可以工作..

作为一个选项,您可以定义 updown

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
  def up
    change_column_default :plussites, :hide_season_selector, true
  end

  def down
    change_column_default :plussites, :hide_season_selector, false
  end
end

【讨论】:

@Lory 但奇怪的是,您的原始代码没有,因为根据文档它看起来是正确的 这对我来说也很奇怪,因为我完全按照文档写的。 @Andrey Deineko 是的,这个项目已经很老了,但今天就参与其中。也许这就是问题所在。 @Lory 顺便说一句,下次总是将环境信息添加到问题中,例如 Ruby/Rails 版本 - 这很重要 ;) @Andray Deineko 我会听取你的建议。谢谢! Спасиба :)

以上是关于使用迁移更改表列的默认值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:迁移更改列的默认值(布尔值)

代码优先迁移中列的 EF6 Oracle 默认值

Yii1在迁移中设置DB列的默认值

根据值更改表列颜色在剃须刀文件中使用 jquery 不起作用

SybaseDB,更改表中现有列的默认值

Point类型的默认值