使用迁移更改表列的默认值
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
),您的代码应该可以工作..
作为一个选项,您可以定义 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
【讨论】:
@Lory 但奇怪的是,您的原始代码没有,因为根据文档它看起来是正确的 这对我来说也很奇怪,因为我完全按照文档写的。 @Andrey Deineko 是的,这个项目已经很老了,但今天就参与其中。也许这就是问题所在。 @Lory 顺便说一句,下次总是将环境信息添加到问题中,例如 Ruby/Rails 版本 - 这很重要 ;) @Andray Deineko 我会听取你的建议。谢谢! Спасиба :)以上是关于使用迁移更改表列的默认值的主要内容,如果未能解决你的问题,请参考以下文章