Skip to content

Commit 5543a44

Browse files
authored
Merge pull request #217 from erizocosmico/perf/update
improve memory footprint and performance of updates
2 parents 90dca92 + 47fd3a5 commit 5543a44

File tree

2 files changed

+51
-10
lines changed

2 files changed

+51
-10
lines changed

benchmarks/bench_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,23 @@ func BenchmarkKallaxInsertWithRelationships(b *testing.B) {
118118
}
119119
}
120120

121+
func BenchmarkKallaxUpdateWithRelationships(b *testing.B) {
122+
db := setupDB(b, openTestDB(b))
123+
defer teardownDB(b, db)
124+
125+
store := NewPersonStore(db)
126+
pers := mkPersonWithRels()
127+
if err := store.Insert(pers); err != nil {
128+
b.Fatalf("error inserting: %s", err)
129+
}
130+
131+
for i := 0; i < b.N; i++ {
132+
if _, err := store.Update(pers); err != nil {
133+
b.Fatalf("error updating: %s", err)
134+
}
135+
}
136+
}
137+
121138
func BenchmarkSQLBoilerInsertWithRelationships(b *testing.B) {
122139
db := setupDB(b, openTestDB(b))
123140
defer teardownDB(b, db)
@@ -193,6 +210,23 @@ func BenchmarkKallaxInsert(b *testing.B) {
193210
}
194211
}
195212

213+
func BenchmarkKallaxUpdate(b *testing.B) {
214+
db := setupDB(b, openTestDB(b))
215+
defer teardownDB(b, db)
216+
217+
store := NewPersonStore(db)
218+
pers := &Person{Name: "foo"}
219+
if err := store.Insert(pers); err != nil {
220+
b.Fatalf("error inserting: %s", err)
221+
}
222+
223+
for i := 0; i < b.N; i++ {
224+
if _, err := store.Update(pers); err != nil {
225+
b.Fatalf("error updating: %s", err)
226+
}
227+
}
228+
}
229+
196230
func BenchmarkSQLBoilerInsert(b *testing.B) {
197231
db := setupDB(b, openTestDB(b))
198232
defer teardownDB(b, db)

store.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,8 @@ func (s *Store) Update(schema Schema, record Record, cols ...SchemaField) (int64
227227
cols = schema.Columns()
228228
}
229229

230-
columnNames := ColumnNames(cols)
230+
// remove the ID from there
231+
columnNames := ColumnNames(cols)[1:]
231232
values, columnNames, err := RecordValues(record, columnNames...)
232233
if err != nil {
233234
return 0, err
@@ -237,18 +238,24 @@ func (s *Store) Update(schema Schema, record Record, cols ...SchemaField) (int64
237238
columnNames = append(columnNames, virtualCols...)
238239
values = append(values, virtualColValues...)
239240

240-
var clauses = make(map[string]interface{}, len(cols))
241+
var query bytes.Buffer
242+
query.WriteString("UPDATE ")
243+
query.WriteString(schema.Table())
244+
query.WriteString(" SET ")
241245
for i, col := range columnNames {
242-
clauses[col] = values[i]
246+
if i != 0 {
247+
query.WriteRune(',')
248+
}
249+
query.WriteString(col)
250+
query.WriteRune('=')
251+
query.WriteString(fmt.Sprintf("$%d", i+1))
243252
}
253+
query.WriteString(" WHERE ")
254+
query.WriteString(schema.ID().String())
255+
query.WriteRune('=')
256+
query.WriteString(fmt.Sprintf("$%d", len(columnNames)+1))
244257

245-
result, err := s.builder.
246-
Update(schema.Table()).
247-
SetMap(clauses).
248-
Where(squirrel.Eq{
249-
schema.ID().String(): record.GetID(),
250-
}).
251-
Exec()
258+
result, err := s.proxy.Exec(query.String(), append(values, record.GetID())...)
252259
if err != nil {
253260
return 0, err
254261
}

0 commit comments

Comments
 (0)