Skip to content

Commit 90dca92

Browse files
authored
Merge pull request #216 from erizocosmico/perf/insert
improve performance and memory footprint of inserts
2 parents 8bfec75 + 01969ea commit 90dca92

File tree

1 file changed

+25
-9
lines changed

1 file changed

+25
-9
lines changed

store.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package kallax
22

33
import (
4+
"bytes"
45
"database/sql"
56
"errors"
67
"fmt"
@@ -162,23 +163,38 @@ func (s *Store) Insert(schema Schema, record Record) error {
162163
cols = append(cols, virtualCols...)
163164
values = append(values, virtualColValues...)
164165

165-
builder := s.builder.
166-
Insert(schema.Table()).
167-
Columns(cols...).
168-
Values(values...)
166+
var colBuf bytes.Buffer
167+
var valBuf bytes.Buffer
168+
169+
for i, col := range cols {
170+
if i != 0 {
171+
colBuf.WriteRune(',')
172+
valBuf.WriteRune(',')
173+
}
174+
colBuf.WriteString(col)
175+
valBuf.WriteString(fmt.Sprintf("$%d", i+1))
176+
}
177+
178+
var query bytes.Buffer
179+
query.WriteString("INSERT INTO ")
180+
query.WriteString(schema.Table())
181+
query.WriteString(" (")
182+
query.WriteString(colBuf.String())
183+
query.WriteString(") VALUES (")
184+
query.WriteString(valBuf.String())
185+
query.WriteString(")")
186+
169187
if schema.isPrimaryKeyAutoIncrementable() {
170188
var pk interface{}
171189
pk, err = record.ColumnAddress(schema.ID().String())
172190
if err != nil {
173191
return err
174192
}
175193

176-
err = builder.
177-
Suffix(fmt.Sprintf("RETURNING %q", schema.ID())).
178-
QueryRow().
179-
Scan(pk)
194+
query.WriteString(fmt.Sprintf(" RETURNING %s", schema.ID().String()))
195+
err = s.proxy.QueryRow(query.String(), values...).Scan(pk)
180196
} else {
181-
_, err = builder.Exec()
197+
_, err = s.proxy.Exec(query.String(), values...)
182198
}
183199

184200
if err != nil {

0 commit comments

Comments
 (0)