-
Notifications
You must be signed in to change notification settings - Fork 0
/
insert.go
82 lines (71 loc) · 1.6 KB
/
insert.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
79
80
81
82
package sqlbuilder
// InsertBuilder is a builder for insert queries
type InsertBuilder struct {
*Builder
table string
columns []string
values [][]interface{}
returning []string
}
// Insert creates a builder for insert queries
func Insert(table string) *InsertBuilder {
b := &InsertBuilder{
Builder: NewBuilder(),
table: table,
columns: []string{},
values: [][]interface{}{},
returning: []string{},
}
return b
}
// Columns adds a list of columns to the insert query
func (b *InsertBuilder) Columns(columns ...string) *InsertBuilder {
b.columns = columns
return b
}
// Values adds column values to the insert query
func (b *InsertBuilder) Values(values ...interface{}) *InsertBuilder {
b.values = append(b.values, values)
return b
}
func (b *InsertBuilder) Returning(columns ...string) *InsertBuilder {
b.returning = columns
return b
}
// Query builds the sql query and returns it along with its arguments
func (b *InsertBuilder) Query() (string, []interface{}) {
b.WriteString("INSERT INTO ")
b.WriteString(b.table)
b.WriteString(" (")
for i, c := range b.columns {
if i > 0 {
b.WriteString(",")
}
b.WriteString(c)
}
b.WriteString(") ")
b.WriteString("VALUES ")
for i, row := range b.values {
if i > 0 {
b.WriteString(", ")
}
b.WriteString("(")
for j, col := range row {
if j > 0 {
b.WriteString(", ")
}
b.WriteArg(col)
}
b.WriteString(")")
}
if len(b.returning) > 0 {
b.WriteString(" RETURNING ")
for i, r := range b.returning {
if i > 0 {
b.WriteString(", ")
}
b.WriteString(r)
}
}
return b.String(), b.args
}