Skip to content

Commit f6fb6c0

Browse files
committed
benchmark
1 parent 0155e14 commit f6fb6c0

File tree

8 files changed

+262
-9
lines changed

8 files changed

+262
-9
lines changed

README.md

+19
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,25 @@ When using Golobby ORM, each database table has a corresponding "Entity" to inte
6767
- One to Many
6868
- Many to Many
6969

70+
## Performance
71+
You can run performance benchmark against `GORM` using
72+
```bash
73+
cd benchmark
74+
go test -v -bench=.
75+
```
76+
here are results from my laptop
77+
```
78+
goos: darwin
79+
goarch: arm64
80+
pkg: github.com/golobby/orm/benchmark
81+
BenchmarkGolobby
82+
BenchmarkGolobby-8 235956 4992 ns/op 2192 B/op 66 allocs/op
83+
BenchmarkGorm
84+
BenchmarkGorm-8 54498 21308 ns/op 7208 B/op 147 allocs/op
85+
PASS
86+
ok github.com/golobby/orm/benchmark 3.118s
87+
```
88+
7089
## Quick Start
7190

7291
The following example demonstrates how to use the GoLobby ORM.

benchmark/bench_test.go

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package benchmark
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
"github.com/golobby/orm"
7+
"gorm.io/driver/sqlite"
8+
"gorm.io/gorm"
9+
"testing"
10+
)
11+
12+
type User struct {
13+
ID int64 `json:"id"`
14+
Username string `json:"username"`
15+
}
16+
17+
var (
18+
gormDB *gorm.DB
19+
)
20+
21+
func setupGolobby() {
22+
db, err := sql.Open("sqlite3", ":memory:")
23+
if err != nil {
24+
panic(err)
25+
}
26+
_, err = db.Exec(`CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, username text)`)
27+
if err != nil {
28+
panic(err)
29+
}
30+
err = orm.SetupConnections(orm.ConnectionConfig{
31+
Name: "default",
32+
DB: db,
33+
Dialect: orm.Dialects.SQLite3,
34+
Entities: []orm.Entity{User{}},
35+
DatabaseValidations: true,
36+
})
37+
if err != nil {
38+
panic(err)
39+
}
40+
41+
}
42+
43+
func setupGORM() {
44+
var err error
45+
gormDB, err = gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
46+
if err != nil {
47+
panic(err)
48+
}
49+
err = gormDB.AutoMigrate(&User2{})
50+
if err != nil {
51+
panic(err)
52+
}
53+
}
54+
55+
func (u User) ConfigureEntity(e *orm.EntityConfigurator) {
56+
e.Table("users").PKSetter(func(o orm.Entity, pk interface{}) {
57+
user := o.(*User)
58+
user.ID = pk.(int64)
59+
})
60+
}
61+
62+
func BenchmarkGolobby(t *testing.B) {
63+
setupGolobby()
64+
t.ResetTimer()
65+
for i := 0; i < t.N; i++ {
66+
var user User
67+
user.Username = "amir" + fmt.Sprint(i)
68+
err := orm.Insert(&user)
69+
if err != nil {
70+
panic(err)
71+
}
72+
}
73+
}
74+
75+
type User2 struct {
76+
gorm.Model
77+
ID int64 `json:"id"`
78+
Username string `json:"username"`
79+
}
80+
81+
func BenchmarkGorm(t *testing.B) {
82+
setupGORM()
83+
t.ResetTimer()
84+
for i := 0; i < t.N; i++ {
85+
var user User2
86+
user.Username = "amir" + fmt.Sprint(i)
87+
err := gormDB.Create(&user).Error
88+
if err != nil {
89+
panic(err)
90+
}
91+
}
92+
}

benchmark/go.mod

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module github.com/golobby/orm/benchmark
2+
3+
go 1.18
4+
5+
require github.com/golobby/orm v1.2.2
6+
7+
replace github.com/golobby/orm => ../
8+
9+
require (
10+
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect
11+
github.com/gertd/go-pluralize v0.1.7 // indirect
12+
github.com/go-openapi/errors v0.19.8 // indirect
13+
github.com/go-openapi/strfmt v0.21.2 // indirect
14+
github.com/go-sql-driver/mysql v1.6.0 // indirect
15+
github.com/go-stack/stack v1.8.0 // indirect
16+
github.com/iancoleman/strcase v0.2.0 // indirect
17+
github.com/jedib0t/go-pretty v4.3.0+incompatible // indirect
18+
github.com/jinzhu/inflection v1.0.0 // indirect
19+
github.com/jinzhu/now v1.1.5 // indirect
20+
github.com/lib/pq v1.10.4 // indirect
21+
github.com/mattn/go-runewidth v0.0.13 // indirect
22+
github.com/mattn/go-sqlite3 v1.14.13 // indirect
23+
github.com/mitchellh/mapstructure v1.3.3 // indirect
24+
github.com/oklog/ulid v1.3.1 // indirect
25+
github.com/rivo/uniseg v0.2.0 // indirect
26+
go.mongodb.org/mongo-driver v1.7.5 // indirect
27+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
28+
gorm.io/driver/sqlite v1.3.2 // indirect
29+
gorm.io/gorm v1.23.5 // indirect
30+
)

benchmark/go.sum

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
2+
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGLmAjMPwCCCo7Jf0W6f9slllCkkv7vyc1yOSg=
3+
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
4+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
5+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8+
github.com/gertd/go-pluralize v0.1.7 h1:RgvJTJ5W7olOoAks97BOwOlekBFsLEyh00W48Z6ZEZY=
9+
github.com/gertd/go-pluralize v0.1.7/go.mod h1:O4eNeeIf91MHh1GJ2I47DNtaesm66NYvjYgAahcqSDQ=
10+
github.com/go-openapi/errors v0.19.8 h1:doM+tQdZbUm9gydV9yR+iQNmztbjj7I3sW4sIcAwIzc=
11+
github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
12+
github.com/go-openapi/strfmt v0.21.2 h1:5NDNgadiX1Vhemth/TH4gCGopWSTdDjxl60H3B7f+os=
13+
github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k=
14+
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
15+
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
16+
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
17+
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
18+
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
19+
github.com/golobby/orm v1.2.2 h1:tSGxPXtyvXWoZF0f6sZg2+S0yKrayjOA7vdCfTuwabY=
20+
github.com/golobby/orm v1.2.2/go.mod h1:773RTIiJRKKECupOfdJfyZ5wU4KIwRYagGLkdNgWk1I=
21+
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
22+
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
23+
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
24+
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
25+
github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=
26+
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
27+
github.com/jedib0t/go-pretty v4.3.0+incompatible h1:CGs8AVhEKg/n9YbUenWmNStRW2PHJzaeDodcfvRAbIo=
28+
github.com/jedib0t/go-pretty v4.3.0+incompatible/go.mod h1:XemHduiw8R651AF9Pt4FwCTKeG3oo7hrHJAoznj9nag=
29+
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
30+
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
31+
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
32+
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
33+
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
34+
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
35+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
36+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
37+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
38+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
39+
github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk=
40+
github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
41+
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
42+
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
43+
github.com/mattn/go-sqlite3 v1.14.11 h1:gt+cp9c0XGqe9S/wAHTL3n/7MqY+siPWgWJgqdsFrzQ=
44+
github.com/mattn/go-sqlite3 v1.14.11/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
45+
github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
46+
github.com/mattn/go-sqlite3 v1.14.13 h1:1tj15ngiFfcZzii7yd82foL+ks+ouQcj8j/TPq3fk1I=
47+
github.com/mattn/go-sqlite3 v1.14.13/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
48+
github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
49+
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
50+
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
51+
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
52+
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
53+
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
54+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
55+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
56+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
57+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
58+
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
59+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
60+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
61+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
62+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
63+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
64+
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
65+
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
66+
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
67+
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
68+
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
69+
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
70+
go.mongodb.org/mongo-driver v1.7.5 h1:ny3p0reEpgsR2cfA5cjgwFZg3Cv/ofFh/8jbhGtz9VI=
71+
go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng=
72+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
73+
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
74+
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
75+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
76+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
77+
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
78+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
79+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
80+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
81+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
82+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
83+
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
84+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
85+
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
86+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
87+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
88+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
89+
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
90+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
91+
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
92+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
93+
gorm.io/driver/sqlite v1.3.2 h1:nWTy4cE52K6nnMhv23wLmur9Y3qWbZvOBz+V4PrGAxg=
94+
gorm.io/driver/sqlite v1.3.2/go.mod h1:B+8GyC9K7VgzJAcrcXMRPdnMcck+8FgJynEehEPM16U=
95+
gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
96+
gorm.io/gorm v1.23.5 h1:TnlF26wScKSvknUC/Rn8t0NLLM22fypYBlvj1+aH6dM=
97+
gorm.io/gorm v1.23.5/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=

configurators.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type EntityConfigurator struct {
1010
connection string
1111
table string
1212
this Entity
13+
setPK func(o Entity, pk interface{})
1314
relations map[string]interface{}
1415
resolveRelations []func()
1516
columnConstraints []*FieldConfigurator
@@ -19,6 +20,11 @@ func newEntityConfigurator() *EntityConfigurator {
1920
return &EntityConfigurator{}
2021
}
2122

23+
func (ec *EntityConfigurator) PKSetter(setter func(o Entity, pk interface{})) *EntityConfigurator {
24+
ec.setPK = setter
25+
return ec
26+
}
27+
2228
func (ec *EntityConfigurator) Table(name string) *EntityConfigurator {
2329
ec.table = name
2430
return ec
@@ -182,4 +188,4 @@ func (fc *FieldConfigurator) IsDeletedAt() *FieldConfigurator {
182188
func (fc *FieldConfigurator) ColumnName(name string) *FieldConfigurator {
183189
fc.column = name
184190
return fc
185-
}
191+
}

orm.go

+11-6
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,11 @@ func setupConnection(config ConnectionConfig) error {
111111
}
112112

113113
s := &connection{
114-
Name: config.Name,
115-
DB: config.DB,
116-
Dialect: config.Dialect,
117-
Schemas: schemas,
118-
DBSchema: make(map[string][]columnSpec),
114+
Name: config.Name,
115+
DB: config.DB,
116+
Dialect: config.Dialect,
117+
Schemas: schemas,
118+
DBSchema: make(map[string][]columnSpec),
119119
DatabaseValidations: config.DatabaseValidations,
120120
}
121121

@@ -175,7 +175,12 @@ func Insert(objs ...Entity) error {
175175
return err
176176
}
177177

178-
getSchemaFor(objs[len(objs)-1]).setPK(objs[len(objs)-1], id)
178+
schm := getSchemaFor(objs[len(objs)-1])
179+
if schm.setPK != nil {
180+
schm.setPK(objs[len(objs)-1], id)
181+
} else {
182+
schm.setPK(objs[len(objs)-1], id)
183+
}
179184
return nil
180185
}
181186

query.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,8 @@ func (w whereClause) ToSql() (string, []interface{}, error) {
589589
return base, args, nil
590590
}
591591

592+
//func (q *QueryBuilder[OUTPUT]) WhereKeyValue(m map) {}
593+
592594
// WhereIn adds a where clause to QueryBuilder using In operator.
593595
func (q *QueryBuilder[OUTPUT]) WhereIn(column string, values ...interface{}) *QueryBuilder[OUTPUT] {
594596
return q.Where(append([]interface{}{column, In}, values...)...)
@@ -750,7 +752,7 @@ type insertStmt struct {
750752
Table string
751753
Columns []string
752754
Values [][]interface{}
753-
Returning string
755+
Returning string
754756
}
755757

756758
func (i insertStmt) flatValues() []interface{} {
@@ -784,7 +786,6 @@ func (i insertStmt) ToSql() (string, []interface{}) {
784786
return base, i.flatValues()
785787
}
786788

787-
788789
func postgresPlaceholder(n int) []string {
789790
output := []string{}
790791
for i := 1; i < n+1; i++ {

schema.go

+3
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,9 @@ func schemaOfHeavyReflectionStuff(v Entity) *schema {
256256
}
257257

258258
schema.columnConstraints = userEntityConfigurator.columnConstraints
259+
if userEntityConfigurator.setPK != nil {
260+
schema.setPK = userEntityConfigurator.setPK
261+
}
259262
if schema.Connection == "" {
260263
schema.Connection = "default"
261264
}

0 commit comments

Comments
 (0)