diff --git a/spec/query/insert_spec.cr b/spec/query/insert_spec.cr index 8a9d7b4..954b582 100644 --- a/spec/query/insert_spec.cr +++ b/spec/query/insert_spec.cr @@ -15,6 +15,20 @@ describe "Query#insert" do end end + context "with explicit arguments" do + it do + q = Query(User).new.insert(:created_at, "now()") + + sql, params = q.build + + sql.should eq <<-SQL + INSERT INTO users (created_at) VALUES (now()) + SQL + + params.should be_empty + end + end + context "with many arguments" do it do ref_uuid = UUID.random diff --git a/src/onyx-sql/query/insert.cr b/src/onyx-sql/query/insert.cr index 2cf6f8e..c0f49b7 100644 --- a/src/onyx-sql/query/insert.cr +++ b/src/onyx-sql/query/insert.cr @@ -59,10 +59,21 @@ module Onyx::SQL self end + def insert(name : T::Field | T::Reference | String, value : String) + if name.is_a?(T::Field) || name.is_a?(T::Reference) + ensure_insert << Insert.new(T.db_column(name), value) + else + ensure_insert << Insert.new(name, value) + end + + @type = :insert + self + end + private struct Insert getter column, value - def initialize(@column : String, @value : Void*) + def initialize(@column : String, @value : Void* | String) end end @@ -94,8 +105,13 @@ module Onyx::SQL end; first = false sql << insert.column - values_sql << (params_index ? "$#{params_index.value += 1}" : "?") - params.not_nil!.push(Box(DB::Any).unbox(insert.value)) if params + + if value = insert.value.as?(Void*) + values_sql << (params_index ? "$#{params_index.value += 1}" : "?") + params.not_nil!.push(Box(DB::Any).unbox(value)) if params + else + values_sql << insert.value.as(String) + end end sql << ") VALUES (" << values_sql << ")"