Skip to content

Commit 3655904

Browse files
authored
add bokwoon95/sq (#96)
1 parent 4252ba4 commit 3655904

File tree

6 files changed

+200
-1
lines changed

6 files changed

+200
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ All package run in no-cache mode.
2828
- [zorm](https://gitee.com/chunanyong/zorm)
2929
- [gen](https://gorm.io/gen/index.html)
3030
- [jet](https://github.com/go-jet/jet)
31+
- [sq](https://github.com/bokwoon95/sq)
3132

3233
See [`go.mod`](go.mod) for their latest versions.
3334

bench/sq.go

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package bench
2+
3+
import (
4+
"database/sql"
5+
"testing"
6+
7+
qm "github.com/bokwoon95/sq"
8+
"github.com/efectn/go-orm-benchmarks/bench/sq/db"
9+
"github.com/efectn/go-orm-benchmarks/helper"
10+
)
11+
12+
// sq supports both templated queries and a query builder.
13+
// This benchmark only uses the query builder.
14+
type Sq struct {
15+
helper.ORMInterface
16+
conn *sql.DB
17+
}
18+
19+
func CreateSq() helper.ORMInterface {
20+
return &Sq{}
21+
}
22+
23+
func (sq *Sq) Name() string {
24+
return "sq"
25+
}
26+
27+
func (sq *Sq) Init() error {
28+
var err error
29+
sq.conn, err = sql.Open("pgx", helper.OrmSource)
30+
if err != nil {
31+
sq.conn = nil
32+
return err
33+
}
34+
return nil
35+
}
36+
37+
func (sq *Sq) Close() error {
38+
return sq.conn.Close()
39+
}
40+
41+
func (sq *Sq) Insert(b *testing.B) {
42+
m := NewModelAlt()
43+
44+
b.ReportAllocs()
45+
b.ResetTimer()
46+
47+
for i := 0; i < b.N; i++ {
48+
m.Id = 0
49+
err := sq.insertModel(&m)
50+
if err != nil {
51+
helper.SetError(b, sq.Name(), "Insert", err.Error())
52+
}
53+
}
54+
}
55+
56+
func (sq *Sq) InsertMulti(b *testing.B) {
57+
ms := make([]Model, 0, 100)
58+
for i := 0; i < 100; i++ {
59+
ms = append(ms, NewModelAlt())
60+
}
61+
62+
b.ReportAllocs()
63+
b.ResetTimer()
64+
65+
for i := 0; i < b.N; i++ {
66+
tbl := qm.New[db.MODELS]("")
67+
query := qm.Postgres.InsertInto(tbl).Columns(tbl.NAME, tbl.TITLE, tbl.FAX, tbl.WEB, tbl.AGE, tbl.RIGHT, tbl.COUNTER)
68+
for _, m := range ms {
69+
query = query.Values(m.Name, m.Title, m.Fax, m.Web, m.Age, m.Right, m.Counter)
70+
}
71+
_, err := qm.Exec(sq.conn, query)
72+
if err != nil {
73+
helper.SetError(b, sq.Name(), "InsertMulti", err.Error())
74+
}
75+
}
76+
}
77+
78+
func (sq *Sq) Update(b *testing.B) {
79+
m := NewModelAlt()
80+
81+
err := sq.insertModel(&m)
82+
if err != nil {
83+
helper.SetError(b, sq.Name(), "Update", err.Error())
84+
}
85+
86+
b.ReportAllocs()
87+
b.ResetTimer()
88+
89+
for i := 0; i < b.N; i++ {
90+
tbl := qm.New[db.MODELS]("")
91+
query := qm.Postgres.Update(tbl).Set(
92+
tbl.NAME.SetString(m.Name),
93+
tbl.TITLE.SetString(m.Title),
94+
tbl.FAX.SetString(m.Fax),
95+
tbl.WEB.SetString(m.Web),
96+
tbl.AGE.SetInt(m.Age),
97+
tbl.RIGHT.SetBool(m.Right),
98+
tbl.COUNTER.SetInt64(m.Counter),
99+
).Where(tbl.ID.EqInt(m.Id))
100+
_, err = qm.Exec(sq.conn, query)
101+
if err != nil {
102+
helper.SetError(b, sq.Name(), "Update", err.Error())
103+
}
104+
}
105+
}
106+
107+
func (sq *Sq) Read(b *testing.B) {
108+
m := NewModelAlt()
109+
110+
err := sq.insertModel(&m)
111+
if err != nil {
112+
helper.SetError(b, sq.Name(), "Read", err.Error())
113+
}
114+
115+
b.ReportAllocs()
116+
b.ResetTimer()
117+
118+
for i := 0; i < b.N; i++ {
119+
tbl := qm.New[db.MODELS]("")
120+
query := qm.Postgres.From(tbl).Where(tbl.ID.EqInt(m.Id))
121+
_, err = qm.FetchOne(sq.conn, query, sq.modelRowMapper(tbl))
122+
if err != nil {
123+
helper.SetError(b, sq.Name(), "Read", err.Error())
124+
}
125+
}
126+
}
127+
128+
func (sq *Sq) ReadSlice(b *testing.B) {
129+
m := NewModelAlt()
130+
131+
for i := 0; i < 100; i++ {
132+
m.Id = 0
133+
err := sq.insertModel(&m)
134+
if err != nil {
135+
helper.SetError(b, sq.Name(), "ReadSlice", err.Error())
136+
}
137+
}
138+
139+
b.ReportAllocs()
140+
b.ResetTimer()
141+
142+
for i := 0; i < b.N; i++ {
143+
tbl := qm.New[db.MODELS]("")
144+
query := qm.Postgres.From(tbl).Where(tbl.ID.GtInt(0)).Limit(100)
145+
_, err := qm.FetchAll(sq.conn, query, sq.modelRowMapper(tbl))
146+
if err != nil {
147+
helper.SetError(b, sq.Name(), "ReadSlice", err.Error())
148+
}
149+
}
150+
}
151+
152+
func (sq *Sq) insertModel(m *Model) error {
153+
var err error
154+
tbl := qm.New[db.MODELS]("")
155+
query := qm.Postgres.InsertInto(tbl).
156+
Columns(tbl.NAME, tbl.TITLE, tbl.FAX, tbl.WEB, tbl.AGE, tbl.RIGHT, tbl.COUNTER).
157+
Values(m.Name, m.Title, m.Fax, m.Web, m.Age, m.Right, m.Counter)
158+
m.Id, err = qm.FetchOne(sq.conn, query, func(r *qm.Row) int {
159+
return r.IntField(tbl.ID)
160+
})
161+
return err
162+
}
163+
164+
func (sq *Sq) modelRowMapper(tbl db.MODELS) func(*qm.Row) Model {
165+
return func(r *qm.Row) Model {
166+
return Model{
167+
Id: r.IntField(tbl.ID),
168+
Name: r.StringField(tbl.NAME),
169+
Title: r.StringField(tbl.TITLE),
170+
Fax: r.StringField(tbl.FAX),
171+
Web: r.StringField(tbl.WEB),
172+
Age: r.IntField(tbl.AGE),
173+
Right: r.BoolField(tbl.RIGHT),
174+
Counter: r.Int64Field(tbl.COUNTER),
175+
}
176+
}
177+
}

bench/sq/db/models.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package db
2+
3+
import (
4+
"github.com/bokwoon95/sq"
5+
)
6+
7+
type MODELS struct {
8+
sq.TableStruct
9+
ID sq.NumberField
10+
NAME sq.StringField
11+
TITLE sq.StringField
12+
FAX sq.StringField
13+
WEB sq.StringField
14+
AGE sq.NumberField
15+
RIGHT sq.BooleanField
16+
COUNTER sq.NumberField
17+
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
entgo.io/ent v0.12.3
77
gitee.com/chunanyong/zorm v1.6.9
88
github.com/astaxie/beego v1.12.3
9+
github.com/bokwoon95/sq v0.5.0
910
github.com/friendsofgo/errors v0.9.2
1011
github.com/go-jet/jet/v2 v2.10.1
1112
github.com/go-pg/pg/v10 v10.11.1

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
122122
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
123123
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
124124
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
125+
github.com/bokwoon95/sq v0.5.0 h1:h8wckz1u2fxJazszPbYDjW8cx9K65nv4xvLT7QdwA3o=
126+
github.com/bokwoon95/sq v0.5.0/go.mod h1:E3X8ARaXQ77XGMvjS0sQrcA1F5BZvq4Ck/91dPsMKR4=
125127
github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
126128
github.com/brianvoe/gofakeit v3.18.0+incompatible h1:wDOmHc9DLG4nRjUVVaxA+CEglKOW72Y5+4WNxUIkjM8=
127129
github.com/brianvoe/gofakeit v3.18.0+incompatible/go.mod h1:kfwdRA90vvNhPutZWfH7WPaDzUjz+CZFqG+rPkOjGOc=

main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ var defaultBenchmarkNames = []string{
2727
"pg", "pgx", "pgx_pool", "pop",
2828
"raw", "reform", "rel", "sqlboiler",
2929
"sqlc", "sqlx", "upper", "xorm",
30-
"zorm", "gen", "jet",
30+
"zorm", "gen", "jet", "sq",
3131
}
3232

3333
type ListOpts []string
@@ -125,6 +125,7 @@ func runBenchmarks(orms ListOpts) {
125125
"zorm": bench.CreateZorm(),
126126
"gen": bench.CreateGen(),
127127
"jet": bench.CreateJet(),
128+
"sq": bench.CreateSq(),
128129
}
129130

130131
table := new(tabwriter.Writer)

0 commit comments

Comments
 (0)