次の効果を持つ Sequel で何かをしたい:
UPDATE my_table SET my_field = DEFAULT WHERE some_condition;
つまり、DB に既に存在するオブジェクトのフィールドを、その列に設定したデフォルト値にリセットしたいと考えています。おそらく次のようなものです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 Update構文を参照でき ます。列の値を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
}