Quickstart
Requirements
Go 1.24 or later.
Installation
go get github.com/zoobzio/astql
go get github.com/zoobzio/dbml
Basic Usage
package main
import (
"fmt"
"github.com/zoobzio/astql"
"github.com/zoobzio/astql/postgres"
"github.com/zoobzio/dbml"
)
func main() {
// 1. Define your schema
project := dbml.NewProject("myapp")
users := dbml.NewTable("users")
users.AddColumn(dbml.NewColumn("id", "bigint"))
users.AddColumn(dbml.NewColumn("username", "varchar"))
users.AddColumn(dbml.NewColumn("email", "varchar"))
users.AddColumn(dbml.NewColumn("active", "boolean"))
project.AddTable(users)
// 2. Create an ASTQL instance
instance, err := astql.NewFromDBML(project)
if err != nil {
panic(err)
}
// 3. Build a query
result, err := astql.Select(instance.T("users")).
Fields(instance.F("username"), instance.F("email")).
Where(instance.C(instance.F("active"), astql.EQ, instance.P("is_active"))).
OrderBy(instance.F("username"), astql.ASC).
Limit(10).
Render(postgres.New())
if err != nil {
panic(err)
}
fmt.Println(result.SQL)
// SELECT "username", "email" FROM "users" WHERE "active" = :is_active ORDER BY "username" ASC LIMIT 10
fmt.Println(result.RequiredParams)
// [is_active]
}
What's Happening
dbml.NewProjectcreates a schema definitiondbml.NewTableandAddColumndefine your table structureastql.NewFromDBMLcreates a validated instance bound to your schemainstance.T,instance.F,instance.Pcreate validated referencesastql.Selectstarts a query builder chain.Render(provider)produces SQL and a list of required parameters using the specified provider
Using with sqlx
The output is designed for use with sqlx named queries:
result, _ := astql.Select(instance.T("users")).
Fields(instance.F("username"), instance.F("email")).
Where(instance.C(instance.F("active"), astql.EQ, instance.P("is_active"))).
Render(postgres.New())
// Execute with sqlx
params := map[string]any{"is_active": true}
rows, err := db.NamedQuery(result.SQL, params)