我想用Sequel做一些具有以下效果的东西:
UPDATE my_table SET my_field = DEFAULT WHERE some_condition;
也就是说,我想将DB上已存在的对象的字段重置为我为该列设置的默认值。也许类似于my_object.my_field = :default
(不起作用)
有办法做到这一点吗?
(我正在使用MySQL)
答案 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
}