+19
-14
query.go
+19
-14
query.go
···
325
type insert struct {
326
into string
327
or InsertOr
328
-
values map[string]any
329
}
330
331
type InsertOr int
···
357
}
358
359
func Insert() insert {
360
-
return insert{
361
-
values: make(map[string]any),
362
-
}
363
}
364
365
type InsertOpt func(s *insert)
···
375
}
376
377
func (s insert) Value(column string, arg any) insert {
378
-
s.values[column] = arg
379
return s
380
}
381
···
388
if s.or != None {
389
sql.WriteString("OR ")
390
sql.WriteString(s.or.String())
391
}
392
393
if s.into == "" {
394
return "", nil, fmt.Errorf("INTO clause is required")
395
}
396
-
sql.WriteString(" INTO ")
397
sql.WriteString(s.into)
398
399
if len(s.values) == 0 {
···
402
403
sql.WriteString(" (")
404
405
-
first := true
406
-
for col, val := range s.values {
407
-
if !first {
408
-
sql.WriteString(",")
409
-
first = !first
410
}
411
412
-
sql.WriteString(col)
413
-
args = append(args, val)
414
}
415
416
sql.WriteString(") VALUES (")
417
-
sql.WriteString(strings.TrimSuffix(strings.Repeat("?,", len(s.values)), ","))
418
sql.WriteString(")")
419
420
return sql.String(), args, nil
···
325
type insert struct {
326
into string
327
or InsertOr
328
+
values []struct {
329
+
col string
330
+
val any
331
+
}
332
}
333
334
type InsertOr int
···
360
}
361
362
func Insert() insert {
363
+
return insert{}
364
}
365
366
type InsertOpt func(s *insert)
···
376
}
377
378
func (s insert) Value(column string, arg any) insert {
379
+
s.values = append(s.values, struct {
380
+
col string
381
+
val any
382
+
}{
383
+
column, arg,
384
+
})
385
return s
386
}
387
···
394
if s.or != None {
395
sql.WriteString("OR ")
396
sql.WriteString(s.or.String())
397
+
sql.WriteString(" ")
398
}
399
400
if s.into == "" {
401
return "", nil, fmt.Errorf("INTO clause is required")
402
}
403
+
sql.WriteString("INTO ")
404
sql.WriteString(s.into)
405
406
if len(s.values) == 0 {
···
409
410
sql.WriteString(" (")
411
412
+
for i, v := range s.values {
413
+
if i != 0 {
414
+
sql.WriteString(", ")
415
}
416
417
+
sql.WriteString(v.col)
418
+
args = append(args, v.val)
419
}
420
421
sql.WriteString(") VALUES (")
422
+
sql.WriteString(strings.TrimSuffix(strings.Repeat("?, ", len(s.values)), ", "))
423
sql.WriteString(")")
424
425
return sql.String(), args, nil
+52
query_test.go
+52
query_test.go
···
742
})
743
}
744
}
745
+
746
+
func TestInsertBuild_Success(t *testing.T) {
747
+
tests := []struct {
748
+
name string
749
+
stmt insert
750
+
expectedSql string
751
+
expectedArgs []any
752
+
}{
753
+
{
754
+
name: "Simple insert",
755
+
stmt: Insert().Into("users").Value("name", "John"),
756
+
expectedSql: "INSERT INTO users (name) VALUES (?)",
757
+
expectedArgs: []any{"John"},
758
+
},
759
+
{
760
+
name: "Replace clause",
761
+
stmt: Insert().Or(Replace).Into("users").Value("name", "John"),
762
+
expectedSql: "INSERT OR REPLACE INTO users (name) VALUES (?)",
763
+
expectedArgs: []any{"John"},
764
+
},
765
+
{
766
+
name: "More values",
767
+
stmt: Insert().Into("users").Value("name", "John").Value("age", 35),
768
+
expectedSql: "INSERT INTO users (name, age) VALUES (?, ?)",
769
+
expectedArgs: []any{"John", 35},
770
+
},
771
+
}
772
+
773
+
for _, test := range tests {
774
+
t.Run(test.name, func(t *testing.T) {
775
+
sql, args, err := test.stmt.Build()
776
+
777
+
if err != nil {
778
+
t.Errorf("Expected no error, got %v", err)
779
+
}
780
+
781
+
if sql != test.expectedSql {
782
+
t.Errorf("Expected '%s', got '%s'", test.expectedSql, sql)
783
+
}
784
+
785
+
if len(args) != len(test.expectedArgs) {
786
+
t.Errorf("Expected '%d' args, got '%d' args", len(test.expectedArgs), len(args))
787
+
}
788
+
789
+
for i := range len(args) {
790
+
if args[i] != test.expectedArgs[i] {
791
+
t.Errorf("Expected '%v', got '%v' at index %d", test.expectedArgs[i], args[i], i)
792
+
}
793
+
}
794
+
})
795
+
}
796
+
}