dew

Dew

Lightweight type-safe ORM for Go with a fluent API and multiple dialects.

Features

Docs map

Quick Start (PostgreSQL)

package main

import (
	"fmt"
	"log"

	"github.com/dr3dnought/dew"
	_ "github.com/lib/pq"
)

type User struct {
	ID    int
	Name  string
	Email string
}

var UserSchema = dew.DefineSchema("users", dew.PostgreSQLDialect{}, func(t dew.Table[User]) struct {
	dew.Table[User]
	ID    dew.IntColumn
	Name  dew.StringColumn
	Email dew.StringColumn
} {
	return struct {
		dew.Table[User]
		ID    dew.IntColumn
		Name  dew.StringColumn
		Email dew.StringColumn
	}{
		Table: t,
		ID:    t.IntColumn("id"),
		Name:  t.StringColumn("name"),
		Email: t.StringColumn("email"),
	}
})

func main() {
	dsn := "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable"
	db, err := dew.Open("postgres", dsn, dew.PostgreSQLDialect{})
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// Create table for the demo (dew doesn't manage migrations)
	_, _ = db.Exec(`CREATE TABLE IF NOT EXISTS users (
		id SERIAL PRIMARY KEY,
		name TEXT NOT NULL,
		email TEXT NOT NULL
	)`)

	// INSERT via Values
	if err := dew.Insert[User](db, UserSchema).
		Columns(UserSchema.Name, UserSchema.Email).
		Values("Alice", "alice@example.com").
		Exec(); err != nil {
		log.Fatal(err)
	}

	// SELECT
	users, err := UserSchema.From(db).
		Select(UserSchema.Name, UserSchema.Email).
		All()
	if err != nil {
		log.Fatal(err)
	}

	for _, u := range users {
		fmt.Printf("User: %s <%s>\n", u.Name, u.Email)
	}
}

See also “Getting Started” and “Examples”.