【问题标题】:Rails migrations: Undo default setting for a columnRails 迁移:撤消列的默认设置
【发布时间】:2010-10-27 14:22:42
【问题描述】:

我有一个问题,我在 Rails 中有一个为列设置默认设置的迁移,如下例所示:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

假设,我想在以后的迁移中删除默认设置,我该如何使用 rails 迁移来做到这一点?

我目前的解决方法是在 rails 迁移中执行自定义 sql 命令,如下所示:

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

但我不喜欢这种方法,因为我现在依赖于底层数据库如何解释这个命令。如果数据库发生更改,此查询可能不再起作用,并且迁移将被破坏。那么,有没有办法表示撤消 Rails 中列的默认设置?

【问题讨论】:

    标签: ruby-on-rails rails-migrations


    【解决方案1】:

    Sounds 就像文档指出的那样,您的“执行”是正确的:

    change_column_default(table_name, column_name, default)
    

    为列设置新的默认值。 如果要设置默认值 为NULL,你不走运。你需要 到 DatabaseStatements#执行 自己适当的 SQL 语句。 例子

    change_column_default(:suppliers, :qualification, 'new')
    change_column_default(:accounts, :authorized, 1)
    

    【讨论】:

    【解决方案2】:

    导轨 5+

    def change
      change_column_default( :table_name, :column_name, from: nil, to: false )
    end
    

    Rails 3 和 Rails 4

    def up
      change_column_default( :table_name, :column_name, nil )
    end
    
    def down
      change_column_default( :table_name, :column_name, false )
    end
    

    【讨论】:

    • 在 postgres 中,这实际上不会删除 CHARACTER VARYING 列的默认值,只需将其设置为 NULL::character varying
    • 在较新的版本中,您可以使其可逆。例如:change_column_default(:table_name, :column_name, from: nil, to: false)
    • @AttilaO。我已经成功运行ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT,我认为不需要将其设置为NULL
    • 仅供参考,看起来@Mark 提到的可逆版本是在 Rails 5+ 中添加的,所以低于它的任何东西,你将无法使用它。
    【解决方案3】:

    以下 sn-p 我用来制作 NULLNOT NULL,但在架构级别跳过 DEFAULT

    def self.up
      change_column :table, :column, :string, :null => false, :default => ""
      change_column_default(:table, :column, nil)
    end
    

    【讨论】:

    • 我没有看到这个答案的附加值,因为接受的答案是一样的。
    【解决方案4】:

    导轨 4

    change_column :courses, :name, :string, limit: 100, null: false
    

    【讨论】:

    • 这个加了NOT NULL约束,跟DEFAULT无关
    • 与DEFAULT +1无关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多