forked fromgocraft/dbr
- Notifications
You must be signed in to change notification settings - Fork0
Additions to Go's database/sql for super fast performance and convenience.
License
NotificationsYou must be signed in to change notification settings
jiyeyuran/dbr
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
gocraft/dbr provides additions to Go's database/sql for super fast performance and convenience.
$ go get -u github.com/gocraft/dbr/v2
import"github.com/gocraft/dbr/v2"
- MySQL
- PostgreSQL
- SQLite3
- MsSQL
Seegodoc for more examples.
// create a connection (e.g. "postgres", "mysql", or "sqlite3")conn,_:=Open("postgres","...",nil)conn.SetMaxOpenConns(10)// create a session for each business unit of execution (e.g. a web request or goworkers job)sess:=conn.NewSession(nil)// create a tx from sessionssess.Begin()
sess:=mysqlSessiontx,err:=sess.Begin()iferr!=nil {return}defertx.RollbackUnlessCommitted()// do stuff...tx.Commit()
// columns are mapped by tag then by fieldtypeSuggestionstruct {IDint64// id, will be autoloaded by last insert idTitleNullString`db:"subject"`// subjects are called titles nowUrlstring`db:"-"`// ignoredsecretstring// ignored}// By default gocraft/dbr converts CamelCase property names to snake_case column_names.// You can override this with struct tags, just like with JSON tags.// This is especially helpful while migrating from legacy systems.varsuggestions []Suggestionsess:=mysqlSessionsess.Select("*").From("suggestions").Load(&suggestions)
// database/sql uses prepared statements, which means each argument// in an IN clause needs its own question mark.// gocraft/dbr, on the other hand, handles interpolation itself// so that you can easily use a single question mark paired with a// dynamically sized slice.sess:=mysqlSessionids:= []int64{1,2,3,4,5}sess.Select("*").From("suggestions").Where("id IN ?",ids)
sess:=mysqlSessionsess.Select("*").From("suggestions").Join("subdomains","suggestions.subdomain_id = subdomains.id")sess.Select("*").From("suggestions").LeftJoin("subdomains","suggestions.subdomain_id = subdomains.id")// join multiple tablessess.Select("*").From("suggestions").Join("subdomains","suggestions.subdomain_id = subdomains.id").Join("accounts","subdomains.accounts_id = accounts.id")
SelectBySql("SELECT `title`, `body` FROM `suggestions` ORDER BY `id` ASC LIMIT 10")
typeSuggestionstruct {IDint64TitleNullStringCreatedAttime.Time}sugg:=&Suggestion{Title:NewNullString("Gopher"),CreatedAt:time.Now(),}sess:=mysqlSessionsess.InsertInto("suggestions").Columns("title").Record(&sugg).Exec()// id is set automaticallyfmt.Println(sugg.ID)
sess:=mysqlSessionsess.InsertInto("suggestions").Pair("title","Gopher").Pair("body","I love go.")
BenchmarkLoadValues/sqlx_10-8 5000 407318 ns/op 3913 B/op 164 allocs/opBenchmarkLoadValues/dbr_10-8 5000 372940 ns/op 3874 B/op 123 allocs/opBenchmarkLoadValues/sqlx_100-8 2000 584197 ns/op 30195 B/op 1428 allocs/opBenchmarkLoadValues/dbr_100-8 3000 558852 ns/op 22965 B/op 937 allocs/opBenchmarkLoadValues/sqlx_1000-8 1000 2319101 ns/op 289339 B/op 14031 allocs/opBenchmarkLoadValues/dbr_1000-8 1000 2310441 ns/op 210092 B/op 9040 allocs/opBenchmarkLoadValues/sqlx_10000-8 100 17004716 ns/op 3193997 B/op 140043 allocs/opBenchmarkLoadValues/dbr_10000-8 100 16150062 ns/op 2394698 B/op 90051 allocs/opBenchmarkLoadValues/sqlx_100000-8 10 170068209 ns/op31679944 B/op 1400053 allocs/opBenchmarkLoadValues/dbr_100000-8 10 147202536 ns/op23680625 B/op 900061 allocs/op
Inspiration from these excellent libraries:
- sqlx - various useful tools and utils for interacting with database/sql.
- Squirrel - simple fluent query builder.
Authors:
- Jonathan Novak --https://github.com/cypriss
- Tai-Lin Chu --https://github.com/taylorchu
- Sponsored byUserVoice
Contributors:
- Paul Bergeron --https://github.com/dinedal - SQLite dialect