1

次の効果を持つ Sequel で何かをしたい:

UPDATE my_table SET my_field = DEFAULT WHERE some_condition;

つまり、DB に既に存在するオブジェクトのフィールドを、その列に設定したデフォルト値にリセットしたいと考えています。おそらく次のようなものです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 Update構文を参照でき ます。列の値を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 に答える