使用默认值更新续集模型

时间:2013-02-01 21:06:59

标签: mysql ruby sequel

我想用Sequel做一些具有以下效果的东西:

UPDATE my_table SET my_field = DEFAULT WHERE some_condition;

也就是说,我想将DB上已存在的对象的字段重置为我为该列设置的默认值。也许类似于my_object.my_field = :default(不起作用)

有办法做到这一点吗?

(我正在使用MySQL)

4 个答案:

答案 0 :(得分:2)

由于使用类型转换的列设置器,使用一个不能正常工作。您可以使用my_object.values[:my_field] = Sequel.lit('DEFAULT')然后保存来解决此问题,但除非作为最后的手段,否则不建议这样做(如果您这样做,则在更新后刷新)。

假设Sequel可以解析数据库中的默认值,您可能想尝试:my_object.my_field = YourModelClass.db_schema[:my_field][:ruby_default]

答案 1 :(得分:1)

您可以参考MySQL Update Syntax 并且您将注意到您可以将列值设置为NULL,如果该列设置为“NOT NULL”,则将其设置为其“默认值”。该值不是您指定的值;相反,它是列类型的默认值(请参阅Data Type Defaults for MySQL)。

答案 2 :(得分:0)

这有用吗?

DB[:my_table].where(...).update(:my_field => 'DEFAULT'.lit)

lit方法将其作为文字SQL元素放入而不进行转义。据我所知:default转入表格引用。

答案 3 :(得分:0)

Jeremay was a bit faster,我可以提供一个更长的例子:

构建testdata:

require 'sequel'
DB = Sequel.sqlite

DB.create_table(:test){
  column :test, :nvarchar, :size => 5, :default => 'aaaa'
}

DB[:test].insert()
DB[:test].insert( 11 )
DB[:test].each{|data|
  p data
}

使用schema,您可以确定默认值:

DEFAULTS = {}
DB.schema(:test).each{| key, options|
  DEFAULTS[key] = options[:ruby_default]
}

p DEFAULTS

现在您可以使用默认值进行更新:

DB[:test].update( :test => DEFAULTS[:test] )

DB[:test].each{|data|
  p data
}