1

我想用 Sequel 做一些事情,效果如下:

UPDATE my_table SET my_field = DEFAULT WHERE some_condition;

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

有没有办法做到这一点?

(我正在使用 MySQL)

4

4 回答 4

2

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

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

于 2013-02-01T21:23:45.943 回答
1

您可以参考MySQL 更新语法 ,您会注意到您可以将列值设置为 NULL,如果该列设置为“NOT NULL”,它将被设置为其默认值。该值不是您分配的值;相反,它是列类型的默认值(请参阅MySQL 的数据类型默认值)。

于 2013-02-01T21:11:15.870 回答
0

这行得通吗?

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

lit方法将其作为文字 SQL 元素放入而不转义。据我所知:default,转入表格参考。

于 2013-02-01T21:23:52.483 回答
0

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
}
于 2013-02-01T21:27:46.680 回答