我想用 Sequel 做一些事情,效果如下:
UPDATE my_table SET my_field = DEFAULT WHERE some_condition;
也就是说,我想将数据库上已存在的对象的字段重置为我为该列设置的默认值。也许像my_object.my_field = :default
(这不起作用)
有没有办法做到这一点?
(我正在使用 MySQL)
由于使用类型转换的列设置器,使用一个不会很好地工作。您可以解决它my_object.values[:my_field] = Sequel.lit('DEFAULT')
然后保存,但除非作为最后的手段(如果您这样做,请在更新后刷新),否则不建议这样做。
假设 Sequel 可以从数据库中解析默认值,您可能想尝试这样做:my_object.my_field = YourModelClass.db_schema[:my_field][:ruby_default]
您可以参考MySQL 更新语法 ,您会注意到您可以将列值设置为 NULL,如果该列设置为“NOT NULL”,它将被设置为其默认值。该值不是您分配的值;相反,它是列类型的默认值(请参阅MySQL 的数据类型默认值)。
这行得通吗?
DB[:my_table].where(...).update(:my_field => 'DEFAULT'.lit)
该lit
方法将其作为文字 SQL 元素放入而不转义。据我所知:default
,转入表格参考。
Jeremay 有点快,我可以提供一个更长的例子:
建立测试数据:
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
}