Method: Sequel::Dataset#insert_sql
- Defined in:
- lib/sequel/dataset/sql.rb
#insert_sql(*values) ⇒ Object
Formats an INSERT statement using the given values. The API is a little complex, and best explained by example:
# Default values
DB[:items].insert_sql #=> 'INSERT INTO items DEFAULT VALUES'
DB[:items].insert_sql({}) #=> 'INSERT INTO items DEFAULT VALUES'
# Values without columns
DB[:items].insert_sql(1,2,3) #=> 'INSERT INTO items VALUES (1, 2, 3)'
DB[:items].insert_sql([1,2,3]) #=> 'INSERT INTO items VALUES (1, 2, 3)'
# Values with columns
DB[:items].insert_sql([:a, :b], [1,2]) #=> 'INSERT INTO items (a, b) VALUES (1, 2)'
DB[:items].insert_sql(:a => 1, :b => 2) #=> 'INSERT INTO items (a, b) VALUES (1, 2)'
# Using a subselect
DB[:items].insert_sql(DB[:old_items]) #=> 'INSERT INTO items SELECT * FROM old_items
# Using a subselect with columns
DB[:items].insert_sql([:a, :b], DB[:old_items]) #=> 'INSERT INTO items (a, b) SELECT * FROM old_items
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/sequel/dataset/sql.rb', line 42 def insert_sql(*values) return static_sql(@opts[:sql]) if @opts[:sql] check_modification_allowed! columns = [] case values.size when 0 return insert_sql({}) when 1 case vals = values.at(0) when Hash vals = @opts[:defaults].merge(vals) if @opts[:defaults] vals = vals.merge(@opts[:overrides]) if @opts[:overrides] values = [] vals.each do |k,v| columns << k values << v end when Dataset, Array, LiteralString values = vals else if vals.respond_to?(:values) && (v = vals.values).is_a?(Hash) return insert_sql(v) end end when 2 if (v0 = values.at(0)).is_a?(Array) && ((v1 = values.at(1)).is_a?(Array) || v1.is_a?(Dataset) || v1.is_a?(LiteralString)) columns, values = v0, v1 raise(Error, "Different number of values and columns given to insert_sql") if values.is_a?(Array) and columns.length != values.length end end columns = columns.map{|k| literal(String === k ? k.to_sym : k)} clone(:columns=>columns, :values=>values)._insert_sql end |