🌱 Beta version
Goq
SQL-based DB access library for Gophers
Features
SQL-based API
Goq provides the low-level API which just wraps SQL clauses as Go methods,
Instead of abstracting a way of query construction as an opinionated API like typical frameworks.
That is, you already know most of the Goq API if you know SQL.
Flexible Result Mapping
Using Goq, you can collect result rows fetched from DB into various format structures:
a slice of your model, single map, map of slices, combination of them, etc.
Custom Query Builder Generation
Goq can generate your custom query builder by go generate
based on your models mapped to DB tables.
This helps you write a query with more type safety and readability.
What does it look like?
import (
"fmt"
_ "github.com/lib/pq"
"github.com/ryym/goq"
)
func main() {
db, err := goq.Open("postgres", conn)
panicIf(err)
defer db.Close()
q := NewBuilder(db.Dialect())
query := q.Select(
q.Countries.ID,
q.Countries.Name,
q.Cities.All(),
).From(
q.Countries,
).Joins(
q.InnerJoin(q.Cities).On(
q.Cities.CountryID.Eq(q.Countries.ID),
),
).Where(
q.Countries.Population.Lte(500000),
q.Cities.Name.Like("New%"),
).OrderBy(
q.Countries.Name,
q.Cities.Name,
)
var countries []Country
var citiesByCountry map[int][]City
err = db.Query(query).Collect(
q.Countries.ToUniqSlice(&countries),
q.Cities.ToSliceMap(&citiesByCountry).By(q.Countries.ID),
)
panicIf(err)
fmt.Println("Complete!", countries, citiesByCountry)
}
Out of Scope Features
Goq is not a DB management framework so does not support any of these:
- schema migration
- schema generation from Go code
- model generation from schema
Resources
Inspiration
Goq is inspired by ScalikeJDBC
which is a Scala library providing SQL-based API.