Documentation
¶
Overview ¶
Package db is a fluent SQL query builder for Go. It builds SQL and bind arguments and, optionally, runs them through database/sql. It is not an ORM: there are no models, relations, hooks or migrations.
Build only (set the dialect first, then chain from Select, Insert, Update or Delete):
sql, args, err := db.Use(db.Postgres).Select().From("users").
Where("votes", ">", 100).
OrderByDesc("created_at").
Limit(10).
ToSQL()
Build and execute:
conn := db.New(sqlDB, db.Postgres)
var users []User
err := conn.Select().From("users").Where("active", true).Get(ctx, &users)
Typed reads take the table from the row type's TableName method (writes use the Insert, Update and Delete builders):
users, err := db.From[User](conn).Where("active", true).Get(ctx)
Values are always sent as bind arguments. Identifiers are always quoted. The *Raw methods and Raw expressions take caller-trusted SQL: never build them from user input.
Index ¶
- Variables
- func PluckAs[V any](ctx context.Context, b *SelectBuilder, column string) ([]V, error)
- func Row(v any) (map[string]any, error)
- func Stream[T any](ctx context.Context, s *SelectBuilder) iter.Seq2[T, error]
- func TableName[T any]() (string, error)
- func ValueAs[V any](ctx context.Context, b *SelectBuilder, column string) (V, error)
- type CTEOption
- type Conn
- type CursorOptions
- type CursorPage
- type CursorPaged
- type DB
- func (db *DB) Delete(table string) *DeleteBuilder
- func (db *DB) Dialect() Dialect
- func (db *DB) Exec(ctx context.Context, sqlText string, args ...any) (int64, error)
- func (db *DB) Insert(table string) *InsertBuilder
- func (db *DB) Query(ctx context.Context, dest any, sqlText string, args ...any) error
- func (db *DB) Select(columns ...string) *SelectBuilder
- func (db *DB) Transaction(ctx context.Context, fn func(tx *DB) error) error
- func (db *DB) TransactionOpts(ctx context.Context, opts *sql.TxOptions, fn func(tx *DB) error) (err error)
- func (db *DB) Truncate(ctx context.Context, table string) error
- func (db *DB) TruncateSQL(table string) ([]Stmt, error)
- func (db *DB) Update(table string) *UpdateBuilder
- func (db *DB) UpdateOrInsert(ctx context.Context, table string, attributes, values map[string]any) (bool, error)
- type DeleteBuilder
- func (d *DeleteBuilder) AllRows() *DeleteBuilder
- func (d *DeleteBuilder) Clone() *DeleteBuilder
- func (d *DeleteBuilder) CrossJoin(table string) *DeleteBuilder
- func (d *DeleteBuilder) CrossJoinSub(sub *SelectBuilder, as string) *DeleteBuilder
- func (d *DeleteBuilder) Err() error
- func (d *DeleteBuilder) Exec(ctx context.Context) (int64, error)
- func (d *DeleteBuilder) Get(ctx context.Context, dest any) error
- func (d *DeleteBuilder) InRandomOrder(seed ...int) *DeleteBuilder
- func (d *DeleteBuilder) Join(table string, first string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) JoinFunc(table string, fn func(*JoinClause)) *DeleteBuilder
- func (d *DeleteBuilder) JoinLateral(sub *SelectBuilder, as string) *DeleteBuilder
- func (d *DeleteBuilder) JoinSub(sub *SelectBuilder, as string, first string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) JoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *DeleteBuilder
- func (d *DeleteBuilder) JoinWhere(table string, column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) Latest(column ...string) *DeleteBuilder
- func (d *DeleteBuilder) LeftJoin(table string, first string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) LeftJoinFunc(table string, fn func(*JoinClause)) *DeleteBuilder
- func (d *DeleteBuilder) LeftJoinLateral(sub *SelectBuilder, as string) *DeleteBuilder
- func (d *DeleteBuilder) LeftJoinSub(sub *SelectBuilder, as string, first string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) LeftJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *DeleteBuilder
- func (d *DeleteBuilder) LeftJoinWhere(table string, column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) Limit(n int) *DeleteBuilder
- func (d *DeleteBuilder) Oldest(column ...string) *DeleteBuilder
- func (d *DeleteBuilder) OrWhere(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereAll(columns []string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereAny(columns []string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereBetween(column string, lo any, hi any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereBetweenColumns(column string, c1 string, c2 string) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereColumn(first string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereDate(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereDay(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereExists(sub *SelectBuilder) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereGroup(fn func(*WhereClause)) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereIn(column string, values any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereIntegerInRaw(column string, values any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereIntegerNotInRaw(column string, values any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereJsonContains(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereJsonContainsKey(column string) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereJsonDoesntContain(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereJsonDoesntContainKey(column string) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereJsonDoesntOverlap(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereJsonLength(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereJsonOverlaps(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereLike(column string, value any, caseSensitive ...bool) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereMap(m map[string]any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereMonth(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNone(columns []string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNot(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNotBetween(column string, lo any, hi any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNotBetweenColumns(column string, c1 string, c2 string) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNotExists(sub *SelectBuilder) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNotIn(column string, values any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNotLike(column string, value any, caseSensitive ...bool) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNotNull(column string) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNull(column string) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereNullSafeEquals(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereRaw(sql string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereRowValues(columns []string, op string, values []any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereTime(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereValueBetween(value any, c1 string, c2 string) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereValueNotBetween(value any, c1 string, c2 string) *DeleteBuilder
- func (d *DeleteBuilder) OrWhereYear(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) OrderBy(column string, direction ...string) *DeleteBuilder
- func (d *DeleteBuilder) OrderByDesc(column string) *DeleteBuilder
- func (d *DeleteBuilder) OrderByRaw(sql string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) Prefix(p string) *DeleteBuilder
- func (d *DeleteBuilder) Reorder() *DeleteBuilder
- func (d *DeleteBuilder) ReorderBy(column string, direction ...string) *DeleteBuilder
- func (d *DeleteBuilder) Returning(columns ...string) *DeleteBuilder
- func (d *DeleteBuilder) RightJoin(table string, first string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) RightJoinFunc(table string, fn func(*JoinClause)) *DeleteBuilder
- func (d *DeleteBuilder) RightJoinSub(sub *SelectBuilder, as string, first string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) RightJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *DeleteBuilder
- func (d *DeleteBuilder) RightJoinWhere(table string, column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) StraightJoin(table string, first string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) Take(n int) *DeleteBuilder
- func (d *DeleteBuilder) ToSQL() (string, []any, error)
- func (d *DeleteBuilder) Where(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereAll(columns []string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereAny(columns []string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereBetween(column string, lo any, hi any) *DeleteBuilder
- func (d *DeleteBuilder) WhereBetweenColumns(column string, c1 string, c2 string) *DeleteBuilder
- func (d *DeleteBuilder) WhereColumn(first string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereDate(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereDay(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereExists(sub *SelectBuilder) *DeleteBuilder
- func (d *DeleteBuilder) WhereGroup(fn func(*WhereClause)) *DeleteBuilder
- func (d *DeleteBuilder) WhereIn(column string, values any) *DeleteBuilder
- func (d *DeleteBuilder) WhereIntegerInRaw(column string, values any) *DeleteBuilder
- func (d *DeleteBuilder) WhereIntegerNotInRaw(column string, values any) *DeleteBuilder
- func (d *DeleteBuilder) WhereJsonContains(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) WhereJsonContainsKey(column string) *DeleteBuilder
- func (d *DeleteBuilder) WhereJsonDoesntContain(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) WhereJsonDoesntContainKey(column string) *DeleteBuilder
- func (d *DeleteBuilder) WhereJsonDoesntOverlap(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) WhereJsonLength(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereJsonOverlaps(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) WhereLike(column string, value any, caseSensitive ...bool) *DeleteBuilder
- func (d *DeleteBuilder) WhereMap(m map[string]any) *DeleteBuilder
- func (d *DeleteBuilder) WhereMonth(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereNone(columns []string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereNot(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereNotBetween(column string, lo any, hi any) *DeleteBuilder
- func (d *DeleteBuilder) WhereNotBetweenColumns(column string, c1 string, c2 string) *DeleteBuilder
- func (d *DeleteBuilder) WhereNotExists(sub *SelectBuilder) *DeleteBuilder
- func (d *DeleteBuilder) WhereNotIn(column string, values any) *DeleteBuilder
- func (d *DeleteBuilder) WhereNotLike(column string, value any, caseSensitive ...bool) *DeleteBuilder
- func (d *DeleteBuilder) WhereNotNull(column string) *DeleteBuilder
- func (d *DeleteBuilder) WhereNull(column string) *DeleteBuilder
- func (d *DeleteBuilder) WhereNullSafeEquals(column string, value any) *DeleteBuilder
- func (d *DeleteBuilder) WhereRaw(sql string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereRowValues(columns []string, op string, values []any) *DeleteBuilder
- func (d *DeleteBuilder) WhereTime(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) WhereValueBetween(value any, c1 string, c2 string) *DeleteBuilder
- func (d *DeleteBuilder) WhereValueNotBetween(value any, c1 string, c2 string) *DeleteBuilder
- func (d *DeleteBuilder) WhereYear(column string, args ...any) *DeleteBuilder
- func (d *DeleteBuilder) With(name string, q *SelectBuilder, opts ...CTEOption) *DeleteBuilder
- func (d *DeleteBuilder) WithRaw(name string, e Expression, opts ...CTEOption) *DeleteBuilder
- func (d *DeleteBuilder) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *DeleteBuilder
- type Dialect
- type Expression
- type HavingClause
- func (h *HavingClause) Having(column string, args ...any) *HavingClause
- func (h *HavingClause) HavingBetween(column string, lo any, hi any) *HavingClause
- func (h *HavingClause) HavingGroup(fn func(*HavingClause)) *HavingClause
- func (h *HavingClause) HavingNotBetween(column string, lo any, hi any) *HavingClause
- func (h *HavingClause) HavingNotNull(column string) *HavingClause
- func (h *HavingClause) HavingNull(column string) *HavingClause
- func (h *HavingClause) HavingRaw(sql string, args ...any) *HavingClause
- func (h *HavingClause) OrHaving(column string, args ...any) *HavingClause
- func (h *HavingClause) OrHavingBetween(column string, lo any, hi any) *HavingClause
- func (h *HavingClause) OrHavingGroup(fn func(*HavingClause)) *HavingClause
- func (h *HavingClause) OrHavingNotBetween(column string, lo any, hi any) *HavingClause
- func (h *HavingClause) OrHavingNotNull(column string) *HavingClause
- func (h *HavingClause) OrHavingNull(column string) *HavingClause
- func (h *HavingClause) OrHavingRaw(sql string, args ...any) *HavingClause
- type InsertBuilder
- func (i *InsertBuilder) Clone() *InsertBuilder
- func (i *InsertBuilder) Err() error
- func (i *InsertBuilder) Exec(ctx context.Context) (int64, error)
- func (i *InsertBuilder) ExecGetID(ctx context.Context, sequence ...string) (int64, error)
- func (i *InsertBuilder) Get(ctx context.Context, dest any) error
- func (i *InsertBuilder) IDSQL(sequence ...string) (string, []any, error)
- func (i *InsertBuilder) Ignore() *InsertBuilder
- func (i *InsertBuilder) Prefix(p string) *InsertBuilder
- func (i *InsertBuilder) Returning(columns ...string) *InsertBuilder
- func (i *InsertBuilder) Rows(structs ...any) *InsertBuilder
- func (i *InsertBuilder) ToSQL() (string, []any, error)
- func (i *InsertBuilder) Upsert(uniqueBy, update []string) *InsertBuilder
- func (i *InsertBuilder) Using(columns []string, sub *SelectBuilder) *InsertBuilder
- func (i *InsertBuilder) Values(rows ...map[string]any) *InsertBuilder
- func (i *InsertBuilder) With(name string, q *SelectBuilder, opts ...CTEOption) *InsertBuilder
- func (i *InsertBuilder) WithRaw(name string, e Expression, opts ...CTEOption) *InsertBuilder
- func (i *InsertBuilder) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *InsertBuilder
- type JoinClause
- func (j *JoinClause) On(first string, args ...any) *JoinClause
- func (j *JoinClause) OnGroup(fn func(*JoinClause)) *JoinClause
- func (j *JoinClause) OrOn(first string, args ...any) *JoinClause
- func (j *JoinClause) OrOnGroup(fn func(*JoinClause)) *JoinClause
- func (j *JoinClause) OrWhere(column string, args ...any) *JoinClause
- func (j *JoinClause) OrWhereIn(column string, values any) *JoinClause
- func (j *JoinClause) OrWhereNotIn(column string, values any) *JoinClause
- func (j *JoinClause) OrWhereNotNull(column string) *JoinClause
- func (j *JoinClause) OrWhereNull(column string) *JoinClause
- func (j *JoinClause) OrWhereRaw(sql string, args ...any) *JoinClause
- func (j *JoinClause) Where(column string, args ...any) *JoinClause
- func (j *JoinClause) WhereIn(column string, values any) *JoinClause
- func (j *JoinClause) WhereNotIn(column string, values any) *JoinClause
- func (j *JoinClause) WhereNotNull(column string) *JoinClause
- func (j *JoinClause) WhereNull(column string) *JoinClause
- func (j *JoinClause) WhereRaw(sql string, args ...any) *JoinClause
- type Option
- type Page
- type Paged
- type Query
- func (q *Query[T]) AddSelect(columns ...string) *Query[T]
- func (q *Query[T]) Apply(fn func(*SelectBuilder)) *Query[T]
- func (q *Query[T]) Avg(ctx context.Context, column string) (float64, error)
- func (q *Query[T]) Builder() *SelectBuilder
- func (q *Query[T]) Chunk(ctx context.Context, size int, fn func([]T) (bool, error)) error
- func (q *Query[T]) ChunkByID(ctx context.Context, size int, fn func([]T) (bool, error), column ...string) error
- func (q *Query[T]) Clone() *Query[T]
- func (q *Query[T]) Count(ctx context.Context) (int64, error)
- func (q *Query[T]) CrossJoin(table string) *Query[T]
- func (q *Query[T]) CrossJoinSub(sub *SelectBuilder, as string) *Query[T]
- func (q *Query[T]) CursorPaginate(ctx context.Context, perPage int, cursor string, opt ...CursorOptions) (CursorPaged[T], error)
- func (q *Query[T]) Distinct() *Query[T]
- func (q *Query[T]) DoesntExist(ctx context.Context) (bool, error)
- func (q *Query[T]) Each(ctx context.Context, fn func(T) error) error
- func (q *Query[T]) Exists(ctx context.Context) (bool, error)
- func (q *Query[T]) Find(ctx context.Context, id any) (T, error)
- func (q *Query[T]) First(ctx context.Context) (T, error)
- func (q *Query[T]) ForPage(page int, perPage int) *Query[T]
- func (q *Query[T]) ForPageAfterID(perPage int, lastID any, column ...string) *Query[T]
- func (q *Query[T]) ForPageBeforeID(perPage int, lastID any, column ...string) *Query[T]
- func (q *Query[T]) ForceIndex(index string) *Query[T]
- func (q *Query[T]) From(table string) *Query[T]
- func (q *Query[T]) FromRaw(sql string, args ...any) *Query[T]
- func (q *Query[T]) FromSub(sub *SelectBuilder, as string) *Query[T]
- func (q *Query[T]) Get(ctx context.Context) ([]T, error)
- func (q *Query[T]) GroupBy(columns ...string) *Query[T]
- func (q *Query[T]) GroupByRaw(sql string, args ...any) *Query[T]
- func (q *Query[T]) Having(column string, args ...any) *Query[T]
- func (q *Query[T]) HavingBetween(column string, lo any, hi any) *Query[T]
- func (q *Query[T]) HavingGroup(fn func(*HavingClause)) *Query[T]
- func (q *Query[T]) HavingNotBetween(column string, lo any, hi any) *Query[T]
- func (q *Query[T]) HavingNotNull(column string) *Query[T]
- func (q *Query[T]) HavingNull(column string) *Query[T]
- func (q *Query[T]) HavingRaw(sql string, args ...any) *Query[T]
- func (q *Query[T]) IgnoreIndex(index string) *Query[T]
- func (q *Query[T]) InRandomOrder(seed ...int) *Query[T]
- func (q *Query[T]) Join(table string, first string, args ...any) *Query[T]
- func (q *Query[T]) JoinFunc(table string, fn func(*JoinClause)) *Query[T]
- func (q *Query[T]) JoinLateral(sub *SelectBuilder, as string) *Query[T]
- func (q *Query[T]) JoinSub(sub *SelectBuilder, as string, first string, args ...any) *Query[T]
- func (q *Query[T]) JoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *Query[T]
- func (q *Query[T]) JoinWhere(table string, column string, args ...any) *Query[T]
- func (q *Query[T]) Latest(column ...string) *Query[T]
- func (q *Query[T]) LeftJoin(table string, first string, args ...any) *Query[T]
- func (q *Query[T]) LeftJoinFunc(table string, fn func(*JoinClause)) *Query[T]
- func (q *Query[T]) LeftJoinLateral(sub *SelectBuilder, as string) *Query[T]
- func (q *Query[T]) LeftJoinSub(sub *SelectBuilder, as string, first string, args ...any) *Query[T]
- func (q *Query[T]) LeftJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *Query[T]
- func (q *Query[T]) LeftJoinWhere(table string, column string, args ...any) *Query[T]
- func (q *Query[T]) Limit(n int) *Query[T]
- func (q *Query[T]) Lock(clause string) *Query[T]
- func (q *Query[T]) LockForUpdate() *Query[T]
- func (q *Query[T]) Offset(n int) *Query[T]
- func (q *Query[T]) Oldest(column ...string) *Query[T]
- func (q *Query[T]) OrHaving(column string, args ...any) *Query[T]
- func (q *Query[T]) OrHavingBetween(column string, lo any, hi any) *Query[T]
- func (q *Query[T]) OrHavingGroup(fn func(*HavingClause)) *Query[T]
- func (q *Query[T]) OrHavingNotBetween(column string, lo any, hi any) *Query[T]
- func (q *Query[T]) OrHavingNotNull(column string) *Query[T]
- func (q *Query[T]) OrHavingNull(column string) *Query[T]
- func (q *Query[T]) OrHavingRaw(sql string, args ...any) *Query[T]
- func (q *Query[T]) OrWhere(column string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereAll(columns []string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereAny(columns []string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereBetween(column string, lo any, hi any) *Query[T]
- func (q *Query[T]) OrWhereBetweenColumns(column string, c1 string, c2 string) *Query[T]
- func (q *Query[T]) OrWhereColumn(first string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereDate(column string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereDay(column string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereExists(sub *SelectBuilder) *Query[T]
- func (q *Query[T]) OrWhereGroup(fn func(*WhereClause)) *Query[T]
- func (q *Query[T]) OrWhereIn(column string, values any) *Query[T]
- func (q *Query[T]) OrWhereIntegerInRaw(column string, values any) *Query[T]
- func (q *Query[T]) OrWhereIntegerNotInRaw(column string, values any) *Query[T]
- func (q *Query[T]) OrWhereJsonContains(column string, value any) *Query[T]
- func (q *Query[T]) OrWhereJsonContainsKey(column string) *Query[T]
- func (q *Query[T]) OrWhereJsonDoesntContain(column string, value any) *Query[T]
- func (q *Query[T]) OrWhereJsonDoesntContainKey(column string) *Query[T]
- func (q *Query[T]) OrWhereJsonDoesntOverlap(column string, value any) *Query[T]
- func (q *Query[T]) OrWhereJsonLength(column string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereJsonOverlaps(column string, value any) *Query[T]
- func (q *Query[T]) OrWhereLike(column string, value any, caseSensitive ...bool) *Query[T]
- func (q *Query[T]) OrWhereMap(m map[string]any) *Query[T]
- func (q *Query[T]) OrWhereMonth(column string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereNone(columns []string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereNot(column string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereNotBetween(column string, lo any, hi any) *Query[T]
- func (q *Query[T]) OrWhereNotBetweenColumns(column string, c1 string, c2 string) *Query[T]
- func (q *Query[T]) OrWhereNotExists(sub *SelectBuilder) *Query[T]
- func (q *Query[T]) OrWhereNotIn(column string, values any) *Query[T]
- func (q *Query[T]) OrWhereNotLike(column string, value any, caseSensitive ...bool) *Query[T]
- func (q *Query[T]) OrWhereNotNull(column string) *Query[T]
- func (q *Query[T]) OrWhereNull(column string) *Query[T]
- func (q *Query[T]) OrWhereNullSafeEquals(column string, value any) *Query[T]
- func (q *Query[T]) OrWhereRaw(sql string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereRowValues(columns []string, op string, values []any) *Query[T]
- func (q *Query[T]) OrWhereTime(column string, args ...any) *Query[T]
- func (q *Query[T]) OrWhereValueBetween(value any, c1 string, c2 string) *Query[T]
- func (q *Query[T]) OrWhereValueNotBetween(value any, c1 string, c2 string) *Query[T]
- func (q *Query[T]) OrWhereYear(column string, args ...any) *Query[T]
- func (q *Query[T]) OrderBy(column string, direction ...string) *Query[T]
- func (q *Query[T]) OrderByDesc(column string) *Query[T]
- func (q *Query[T]) OrderByRaw(sql string, args ...any) *Query[T]
- func (q *Query[T]) Paginate(ctx context.Context, page, perPage int) (Paged[T], error)
- func (q *Query[T]) Reorder() *Query[T]
- func (q *Query[T]) ReorderBy(column string, direction ...string) *Query[T]
- func (q *Query[T]) RightJoin(table string, first string, args ...any) *Query[T]
- func (q *Query[T]) RightJoinFunc(table string, fn func(*JoinClause)) *Query[T]
- func (q *Query[T]) RightJoinSub(sub *SelectBuilder, as string, first string, args ...any) *Query[T]
- func (q *Query[T]) RightJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *Query[T]
- func (q *Query[T]) RightJoinWhere(table string, column string, args ...any) *Query[T]
- func (q *Query[T]) Select(columns ...string) *Query[T]
- func (q *Query[T]) SelectRaw(sql string, args ...any) *Query[T]
- func (q *Query[T]) SelectSub(sub *SelectBuilder, as string) *Query[T]
- func (q *Query[T]) SharedLock() *Query[T]
- func (q *Query[T]) SimplePaginate(ctx context.Context, page, perPage int) (SimplePaged[T], error)
- func (q *Query[T]) Skip(n int) *Query[T]
- func (q *Query[T]) Sole(ctx context.Context) (T, error)
- func (q *Query[T]) StraightJoin(table string, first string, args ...any) *Query[T]
- func (q *Query[T]) Stream(ctx context.Context) iter.Seq2[T, error]
- func (q *Query[T]) Sum(ctx context.Context, column string) (float64, error)
- func (q *Query[T]) Take(n int) *Query[T]
- func (q *Query[T]) Union(sub *SelectBuilder) *Query[T]
- func (q *Query[T]) UnionAll(sub *SelectBuilder) *Query[T]
- func (q *Query[T]) Unless(cond bool, fn func(*Query[T])) *Query[T]
- func (q *Query[T]) UseIndex(index string) *Query[T]
- func (q *Query[T]) When(cond bool, fn func(*Query[T])) *Query[T]
- func (q *Query[T]) Where(column string, args ...any) *Query[T]
- func (q *Query[T]) WhereAll(columns []string, args ...any) *Query[T]
- func (q *Query[T]) WhereAny(columns []string, args ...any) *Query[T]
- func (q *Query[T]) WhereBetween(column string, lo any, hi any) *Query[T]
- func (q *Query[T]) WhereBetweenColumns(column string, c1 string, c2 string) *Query[T]
- func (q *Query[T]) WhereColumn(first string, args ...any) *Query[T]
- func (q *Query[T]) WhereDate(column string, args ...any) *Query[T]
- func (q *Query[T]) WhereDay(column string, args ...any) *Query[T]
- func (q *Query[T]) WhereExists(sub *SelectBuilder) *Query[T]
- func (q *Query[T]) WhereGroup(fn func(*WhereClause)) *Query[T]
- func (q *Query[T]) WhereIn(column string, values any) *Query[T]
- func (q *Query[T]) WhereIntegerInRaw(column string, values any) *Query[T]
- func (q *Query[T]) WhereIntegerNotInRaw(column string, values any) *Query[T]
- func (q *Query[T]) WhereJsonContains(column string, value any) *Query[T]
- func (q *Query[T]) WhereJsonContainsKey(column string) *Query[T]
- func (q *Query[T]) WhereJsonDoesntContain(column string, value any) *Query[T]
- func (q *Query[T]) WhereJsonDoesntContainKey(column string) *Query[T]
- func (q *Query[T]) WhereJsonDoesntOverlap(column string, value any) *Query[T]
- func (q *Query[T]) WhereJsonLength(column string, args ...any) *Query[T]
- func (q *Query[T]) WhereJsonOverlaps(column string, value any) *Query[T]
- func (q *Query[T]) WhereLike(column string, value any, caseSensitive ...bool) *Query[T]
- func (q *Query[T]) WhereMap(m map[string]any) *Query[T]
- func (q *Query[T]) WhereMonth(column string, args ...any) *Query[T]
- func (q *Query[T]) WhereNone(columns []string, args ...any) *Query[T]
- func (q *Query[T]) WhereNot(column string, args ...any) *Query[T]
- func (q *Query[T]) WhereNotBetween(column string, lo any, hi any) *Query[T]
- func (q *Query[T]) WhereNotBetweenColumns(column string, c1 string, c2 string) *Query[T]
- func (q *Query[T]) WhereNotExists(sub *SelectBuilder) *Query[T]
- func (q *Query[T]) WhereNotIn(column string, values any) *Query[T]
- func (q *Query[T]) WhereNotLike(column string, value any, caseSensitive ...bool) *Query[T]
- func (q *Query[T]) WhereNotNull(column string) *Query[T]
- func (q *Query[T]) WhereNull(column string) *Query[T]
- func (q *Query[T]) WhereNullSafeEquals(column string, value any) *Query[T]
- func (q *Query[T]) WhereRaw(sql string, args ...any) *Query[T]
- func (q *Query[T]) WhereRowValues(columns []string, op string, values []any) *Query[T]
- func (q *Query[T]) WhereTime(column string, args ...any) *Query[T]
- func (q *Query[T]) WhereValueBetween(value any, c1 string, c2 string) *Query[T]
- func (q *Query[T]) WhereValueNotBetween(value any, c1 string, c2 string) *Query[T]
- func (q *Query[T]) WhereYear(column string, args ...any) *Query[T]
- func (q *Query[T]) With(name string, sub *SelectBuilder, opts ...CTEOption) *Query[T]
- func (q *Query[T]) WithRaw(name string, e Expression, opts ...CTEOption) *Query[T]
- func (q *Query[T]) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *Query[T]
- type QueryEvent
- type SelectBuilder
- func (s *SelectBuilder) AddSelect(columns ...string) *SelectBuilder
- func (s *SelectBuilder) Aggregate(ctx context.Context, fn string, column string, dest any) error
- func (s *SelectBuilder) AggregateSQL(fn string, column string) (string, []any, error)
- func (s *SelectBuilder) Avg(ctx context.Context, column string) (float64, error)
- func (s *SelectBuilder) Chunk(ctx context.Context, size int, dest any, fn func() (bool, error)) error
- func (s *SelectBuilder) ChunkByID(ctx context.Context, size int, dest any, fn func() (bool, error), ...) error
- func (s *SelectBuilder) Clone() *SelectBuilder
- func (s *SelectBuilder) Count(ctx context.Context, column ...string) (int64, error)
- func (s *SelectBuilder) CrossJoin(table string) *SelectBuilder
- func (s *SelectBuilder) CrossJoinSub(sub *SelectBuilder, as string) *SelectBuilder
- func (s *SelectBuilder) CursorPaginate(ctx context.Context, perPage int, cursor string, dest any, ...) (CursorPage, error)
- func (s *SelectBuilder) Distinct() *SelectBuilder
- func (s *SelectBuilder) DoesntExist(ctx context.Context) (bool, error)
- func (s *SelectBuilder) Each(ctx context.Context, dest any, fn func() error) error
- func (s *SelectBuilder) Err() error
- func (s *SelectBuilder) Exists(ctx context.Context) (bool, error)
- func (s *SelectBuilder) ExistsSQL() (string, []any, error)
- func (s *SelectBuilder) Find(ctx context.Context, id any, dest any) error
- func (s *SelectBuilder) First(ctx context.Context, dest any) error
- func (s *SelectBuilder) ForPage(page int, perPage int) *SelectBuilder
- func (s *SelectBuilder) ForPageAfterID(perPage int, lastID any, column ...string) *SelectBuilder
- func (s *SelectBuilder) ForPageBeforeID(perPage int, lastID any, column ...string) *SelectBuilder
- func (s *SelectBuilder) ForceIndex(index string) *SelectBuilder
- func (s *SelectBuilder) From(table string) *SelectBuilder
- func (s *SelectBuilder) FromRaw(sql string, args ...any) *SelectBuilder
- func (s *SelectBuilder) FromSub(sub *SelectBuilder, as string) *SelectBuilder
- func (s *SelectBuilder) Get(ctx context.Context, dest any) error
- func (s *SelectBuilder) GroupBy(columns ...string) *SelectBuilder
- func (s *SelectBuilder) GroupByRaw(sql string, args ...any) *SelectBuilder
- func (s *SelectBuilder) Having(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) HavingBetween(column string, lo any, hi any) *SelectBuilder
- func (s *SelectBuilder) HavingGroup(fn func(*HavingClause)) *SelectBuilder
- func (s *SelectBuilder) HavingNotBetween(column string, lo any, hi any) *SelectBuilder
- func (s *SelectBuilder) HavingNotNull(column string) *SelectBuilder
- func (s *SelectBuilder) HavingNull(column string) *SelectBuilder
- func (s *SelectBuilder) HavingRaw(sql string, args ...any) *SelectBuilder
- func (s *SelectBuilder) IgnoreIndex(index string) *SelectBuilder
- func (s *SelectBuilder) InRandomOrder(seed ...int) *SelectBuilder
- func (s *SelectBuilder) Join(table string, first string, args ...any) *SelectBuilder
- func (s *SelectBuilder) JoinFunc(table string, fn func(*JoinClause)) *SelectBuilder
- func (s *SelectBuilder) JoinLateral(sub *SelectBuilder, as string) *SelectBuilder
- func (s *SelectBuilder) JoinSub(sub *SelectBuilder, as string, first string, args ...any) *SelectBuilder
- func (s *SelectBuilder) JoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *SelectBuilder
- func (s *SelectBuilder) JoinWhere(table string, column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) Latest(column ...string) *SelectBuilder
- func (s *SelectBuilder) LeftJoin(table string, first string, args ...any) *SelectBuilder
- func (s *SelectBuilder) LeftJoinFunc(table string, fn func(*JoinClause)) *SelectBuilder
- func (s *SelectBuilder) LeftJoinLateral(sub *SelectBuilder, as string) *SelectBuilder
- func (s *SelectBuilder) LeftJoinSub(sub *SelectBuilder, as string, first string, args ...any) *SelectBuilder
- func (s *SelectBuilder) LeftJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *SelectBuilder
- func (s *SelectBuilder) LeftJoinWhere(table string, column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) Limit(n int) *SelectBuilder
- func (s *SelectBuilder) Lock(clause string) *SelectBuilder
- func (s *SelectBuilder) LockForUpdate() *SelectBuilder
- func (s *SelectBuilder) Max(ctx context.Context, column string, dest any) error
- func (s *SelectBuilder) Min(ctx context.Context, column string, dest any) error
- func (s *SelectBuilder) MustRawSQL() string
- func (s *SelectBuilder) MustSQL() (string, []any)
- func (s *SelectBuilder) Offset(n int) *SelectBuilder
- func (s *SelectBuilder) Oldest(column ...string) *SelectBuilder
- func (s *SelectBuilder) OrHaving(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrHavingBetween(column string, lo any, hi any) *SelectBuilder
- func (s *SelectBuilder) OrHavingGroup(fn func(*HavingClause)) *SelectBuilder
- func (s *SelectBuilder) OrHavingNotBetween(column string, lo any, hi any) *SelectBuilder
- func (s *SelectBuilder) OrHavingNotNull(column string) *SelectBuilder
- func (s *SelectBuilder) OrHavingNull(column string) *SelectBuilder
- func (s *SelectBuilder) OrHavingRaw(sql string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhere(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereAll(columns []string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereAny(columns []string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereBetween(column string, lo any, hi any) *SelectBuilder
- func (s *SelectBuilder) OrWhereBetweenColumns(column string, c1 string, c2 string) *SelectBuilder
- func (s *SelectBuilder) OrWhereColumn(first string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereDate(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereDay(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereExists(sub *SelectBuilder) *SelectBuilder
- func (s *SelectBuilder) OrWhereGroup(fn func(*WhereClause)) *SelectBuilder
- func (s *SelectBuilder) OrWhereIn(column string, values any) *SelectBuilder
- func (s *SelectBuilder) OrWhereIntegerInRaw(column string, values any) *SelectBuilder
- func (s *SelectBuilder) OrWhereIntegerNotInRaw(column string, values any) *SelectBuilder
- func (s *SelectBuilder) OrWhereJsonContains(column string, value any) *SelectBuilder
- func (s *SelectBuilder) OrWhereJsonContainsKey(column string) *SelectBuilder
- func (s *SelectBuilder) OrWhereJsonDoesntContain(column string, value any) *SelectBuilder
- func (s *SelectBuilder) OrWhereJsonDoesntContainKey(column string) *SelectBuilder
- func (s *SelectBuilder) OrWhereJsonDoesntOverlap(column string, value any) *SelectBuilder
- func (s *SelectBuilder) OrWhereJsonLength(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereJsonOverlaps(column string, value any) *SelectBuilder
- func (s *SelectBuilder) OrWhereLike(column string, value any, caseSensitive ...bool) *SelectBuilder
- func (s *SelectBuilder) OrWhereMap(m map[string]any) *SelectBuilder
- func (s *SelectBuilder) OrWhereMonth(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereNone(columns []string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereNot(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereNotBetween(column string, lo any, hi any) *SelectBuilder
- func (s *SelectBuilder) OrWhereNotBetweenColumns(column string, c1 string, c2 string) *SelectBuilder
- func (s *SelectBuilder) OrWhereNotExists(sub *SelectBuilder) *SelectBuilder
- func (s *SelectBuilder) OrWhereNotIn(column string, values any) *SelectBuilder
- func (s *SelectBuilder) OrWhereNotLike(column string, value any, caseSensitive ...bool) *SelectBuilder
- func (s *SelectBuilder) OrWhereNotNull(column string) *SelectBuilder
- func (s *SelectBuilder) OrWhereNull(column string) *SelectBuilder
- func (s *SelectBuilder) OrWhereNullSafeEquals(column string, value any) *SelectBuilder
- func (s *SelectBuilder) OrWhereRaw(sql string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereRowValues(columns []string, op string, values []any) *SelectBuilder
- func (s *SelectBuilder) OrWhereTime(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrWhereValueBetween(value any, c1 string, c2 string) *SelectBuilder
- func (s *SelectBuilder) OrWhereValueNotBetween(value any, c1 string, c2 string) *SelectBuilder
- func (s *SelectBuilder) OrWhereYear(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) OrderBy(column string, direction ...string) *SelectBuilder
- func (s *SelectBuilder) OrderByDesc(column string) *SelectBuilder
- func (s *SelectBuilder) OrderByRaw(sql string, args ...any) *SelectBuilder
- func (s *SelectBuilder) Paginate(ctx context.Context, page int, perPage int, dest any) (Page, error)
- func (s *SelectBuilder) Pluck(ctx context.Context, column string, dest any) error
- func (s *SelectBuilder) PluckMap(ctx context.Context, column string, key string, dest any) error
- func (s *SelectBuilder) Prefix(p string) *SelectBuilder
- func (s *SelectBuilder) Reorder() *SelectBuilder
- func (s *SelectBuilder) ReorderBy(column string, direction ...string) *SelectBuilder
- func (s *SelectBuilder) RightJoin(table string, first string, args ...any) *SelectBuilder
- func (s *SelectBuilder) RightJoinFunc(table string, fn func(*JoinClause)) *SelectBuilder
- func (s *SelectBuilder) RightJoinSub(sub *SelectBuilder, as string, first string, args ...any) *SelectBuilder
- func (s *SelectBuilder) RightJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *SelectBuilder
- func (s *SelectBuilder) RightJoinWhere(table string, column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) Select(columns ...string) *SelectBuilder
- func (s *SelectBuilder) SelectRaw(sql string, args ...any) *SelectBuilder
- func (s *SelectBuilder) SelectSub(sub *SelectBuilder, as string) *SelectBuilder
- func (s *SelectBuilder) SharedLock() *SelectBuilder
- func (s *SelectBuilder) SimplePaginate(ctx context.Context, page int, perPage int, dest any) (SimplePage, error)
- func (s *SelectBuilder) Skip(n int) *SelectBuilder
- func (s *SelectBuilder) Sole(ctx context.Context, dest any) error
- func (s *SelectBuilder) StraightJoin(table string, first string, args ...any) *SelectBuilder
- func (s *SelectBuilder) Sum(ctx context.Context, column string) (float64, error)
- func (s *SelectBuilder) Take(n int) *SelectBuilder
- func (s *SelectBuilder) Tap(fn func(*SelectBuilder)) *SelectBuilder
- func (s *SelectBuilder) ToRawSQL() (string, error)
- func (s *SelectBuilder) ToSQL() (string, []any, error)
- func (s *SelectBuilder) Union(q *SelectBuilder) *SelectBuilder
- func (s *SelectBuilder) UnionAll(q *SelectBuilder) *SelectBuilder
- func (s *SelectBuilder) Unless(cond bool, fn func(*SelectBuilder)) *SelectBuilder
- func (s *SelectBuilder) UseIndex(index string) *SelectBuilder
- func (s *SelectBuilder) Value(ctx context.Context, column string, dest any) error
- func (s *SelectBuilder) When(cond bool, fn func(*SelectBuilder)) *SelectBuilder
- func (s *SelectBuilder) Where(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereAll(columns []string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereAny(columns []string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereBetween(column string, lo any, hi any) *SelectBuilder
- func (s *SelectBuilder) WhereBetweenColumns(column string, c1 string, c2 string) *SelectBuilder
- func (s *SelectBuilder) WhereColumn(first string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereDate(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereDay(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereExists(sub *SelectBuilder) *SelectBuilder
- func (s *SelectBuilder) WhereGroup(fn func(*WhereClause)) *SelectBuilder
- func (s *SelectBuilder) WhereIn(column string, values any) *SelectBuilder
- func (s *SelectBuilder) WhereIntegerInRaw(column string, values any) *SelectBuilder
- func (s *SelectBuilder) WhereIntegerNotInRaw(column string, values any) *SelectBuilder
- func (s *SelectBuilder) WhereJsonContains(column string, value any) *SelectBuilder
- func (s *SelectBuilder) WhereJsonContainsKey(column string) *SelectBuilder
- func (s *SelectBuilder) WhereJsonDoesntContain(column string, value any) *SelectBuilder
- func (s *SelectBuilder) WhereJsonDoesntContainKey(column string) *SelectBuilder
- func (s *SelectBuilder) WhereJsonDoesntOverlap(column string, value any) *SelectBuilder
- func (s *SelectBuilder) WhereJsonLength(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereJsonOverlaps(column string, value any) *SelectBuilder
- func (s *SelectBuilder) WhereLike(column string, value any, caseSensitive ...bool) *SelectBuilder
- func (s *SelectBuilder) WhereMap(m map[string]any) *SelectBuilder
- func (s *SelectBuilder) WhereMonth(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereNone(columns []string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereNot(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereNotBetween(column string, lo any, hi any) *SelectBuilder
- func (s *SelectBuilder) WhereNotBetweenColumns(column string, c1 string, c2 string) *SelectBuilder
- func (s *SelectBuilder) WhereNotExists(sub *SelectBuilder) *SelectBuilder
- func (s *SelectBuilder) WhereNotIn(column string, values any) *SelectBuilder
- func (s *SelectBuilder) WhereNotLike(column string, value any, caseSensitive ...bool) *SelectBuilder
- func (s *SelectBuilder) WhereNotNull(column string) *SelectBuilder
- func (s *SelectBuilder) WhereNull(column string) *SelectBuilder
- func (s *SelectBuilder) WhereNullSafeEquals(column string, value any) *SelectBuilder
- func (s *SelectBuilder) WhereRaw(sql string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereRowValues(columns []string, op string, values []any) *SelectBuilder
- func (s *SelectBuilder) WhereTime(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) WhereValueBetween(value any, c1 string, c2 string) *SelectBuilder
- func (s *SelectBuilder) WhereValueNotBetween(value any, c1 string, c2 string) *SelectBuilder
- func (s *SelectBuilder) WhereYear(column string, args ...any) *SelectBuilder
- func (s *SelectBuilder) With(name string, q *SelectBuilder, opts ...CTEOption) *SelectBuilder
- func (s *SelectBuilder) WithRaw(name string, e Expression, opts ...CTEOption) *SelectBuilder
- func (s *SelectBuilder) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *SelectBuilder
- type SimplePage
- type SimplePaged
- type Stmt
- type Tabler
- type UpdateBuilder
- func (u *UpdateBuilder) AllRows() *UpdateBuilder
- func (u *UpdateBuilder) Clone() *UpdateBuilder
- func (u *UpdateBuilder) CrossJoin(table string) *UpdateBuilder
- func (u *UpdateBuilder) CrossJoinSub(sub *SelectBuilder, as string) *UpdateBuilder
- func (u *UpdateBuilder) Decrement(column string, amount any) *UpdateBuilder
- func (u *UpdateBuilder) DecrementEach(amounts map[string]any) *UpdateBuilder
- func (u *UpdateBuilder) Err() error
- func (u *UpdateBuilder) Exec(ctx context.Context) (int64, error)
- func (u *UpdateBuilder) FromJoins() *UpdateBuilder
- func (u *UpdateBuilder) Get(ctx context.Context, dest any) error
- func (u *UpdateBuilder) InRandomOrder(seed ...int) *UpdateBuilder
- func (u *UpdateBuilder) Increment(column string, amount any) *UpdateBuilder
- func (u *UpdateBuilder) IncrementEach(amounts map[string]any) *UpdateBuilder
- func (u *UpdateBuilder) Join(table string, first string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) JoinFunc(table string, fn func(*JoinClause)) *UpdateBuilder
- func (u *UpdateBuilder) JoinLateral(sub *SelectBuilder, as string) *UpdateBuilder
- func (u *UpdateBuilder) JoinSub(sub *SelectBuilder, as string, first string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) JoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *UpdateBuilder
- func (u *UpdateBuilder) JoinWhere(table string, column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) Latest(column ...string) *UpdateBuilder
- func (u *UpdateBuilder) LeftJoin(table string, first string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) LeftJoinFunc(table string, fn func(*JoinClause)) *UpdateBuilder
- func (u *UpdateBuilder) LeftJoinLateral(sub *SelectBuilder, as string) *UpdateBuilder
- func (u *UpdateBuilder) LeftJoinSub(sub *SelectBuilder, as string, first string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) LeftJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *UpdateBuilder
- func (u *UpdateBuilder) LeftJoinWhere(table string, column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) Limit(n int) *UpdateBuilder
- func (u *UpdateBuilder) Oldest(column ...string) *UpdateBuilder
- func (u *UpdateBuilder) OrWhere(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereAll(columns []string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereAny(columns []string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereBetween(column string, lo any, hi any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereBetweenColumns(column string, c1 string, c2 string) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereColumn(first string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereDate(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereDay(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereExists(sub *SelectBuilder) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereGroup(fn func(*WhereClause)) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereIn(column string, values any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereIntegerInRaw(column string, values any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereIntegerNotInRaw(column string, values any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereJsonContains(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereJsonContainsKey(column string) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereJsonDoesntContain(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereJsonDoesntContainKey(column string) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereJsonDoesntOverlap(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereJsonLength(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereJsonOverlaps(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereLike(column string, value any, caseSensitive ...bool) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereMap(m map[string]any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereMonth(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNone(columns []string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNot(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNotBetween(column string, lo any, hi any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNotBetweenColumns(column string, c1 string, c2 string) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNotExists(sub *SelectBuilder) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNotIn(column string, values any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNotLike(column string, value any, caseSensitive ...bool) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNotNull(column string) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNull(column string) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereNullSafeEquals(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereRaw(sql string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereRowValues(columns []string, op string, values []any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereTime(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereValueBetween(value any, c1 string, c2 string) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereValueNotBetween(value any, c1 string, c2 string) *UpdateBuilder
- func (u *UpdateBuilder) OrWhereYear(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) OrderBy(column string, direction ...string) *UpdateBuilder
- func (u *UpdateBuilder) OrderByDesc(column string) *UpdateBuilder
- func (u *UpdateBuilder) OrderByRaw(sql string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) Prefix(p string) *UpdateBuilder
- func (u *UpdateBuilder) Reorder() *UpdateBuilder
- func (u *UpdateBuilder) ReorderBy(column string, direction ...string) *UpdateBuilder
- func (u *UpdateBuilder) Returning(columns ...string) *UpdateBuilder
- func (u *UpdateBuilder) RightJoin(table string, first string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) RightJoinFunc(table string, fn func(*JoinClause)) *UpdateBuilder
- func (u *UpdateBuilder) RightJoinSub(sub *SelectBuilder, as string, first string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) RightJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *UpdateBuilder
- func (u *UpdateBuilder) RightJoinWhere(table string, column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) Set(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) SetMap(values map[string]any) *UpdateBuilder
- func (u *UpdateBuilder) SetRow(row any) *UpdateBuilder
- func (u *UpdateBuilder) StraightJoin(table string, first string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) Take(n int) *UpdateBuilder
- func (u *UpdateBuilder) ToSQL() (string, []any, error)
- func (u *UpdateBuilder) Where(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereAll(columns []string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereAny(columns []string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereBetween(column string, lo any, hi any) *UpdateBuilder
- func (u *UpdateBuilder) WhereBetweenColumns(column string, c1 string, c2 string) *UpdateBuilder
- func (u *UpdateBuilder) WhereColumn(first string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereDate(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereDay(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereExists(sub *SelectBuilder) *UpdateBuilder
- func (u *UpdateBuilder) WhereGroup(fn func(*WhereClause)) *UpdateBuilder
- func (u *UpdateBuilder) WhereIn(column string, values any) *UpdateBuilder
- func (u *UpdateBuilder) WhereIntegerInRaw(column string, values any) *UpdateBuilder
- func (u *UpdateBuilder) WhereIntegerNotInRaw(column string, values any) *UpdateBuilder
- func (u *UpdateBuilder) WhereJsonContains(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) WhereJsonContainsKey(column string) *UpdateBuilder
- func (u *UpdateBuilder) WhereJsonDoesntContain(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) WhereJsonDoesntContainKey(column string) *UpdateBuilder
- func (u *UpdateBuilder) WhereJsonDoesntOverlap(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) WhereJsonLength(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereJsonOverlaps(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) WhereLike(column string, value any, caseSensitive ...bool) *UpdateBuilder
- func (u *UpdateBuilder) WhereMap(m map[string]any) *UpdateBuilder
- func (u *UpdateBuilder) WhereMonth(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereNone(columns []string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereNot(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereNotBetween(column string, lo any, hi any) *UpdateBuilder
- func (u *UpdateBuilder) WhereNotBetweenColumns(column string, c1 string, c2 string) *UpdateBuilder
- func (u *UpdateBuilder) WhereNotExists(sub *SelectBuilder) *UpdateBuilder
- func (u *UpdateBuilder) WhereNotIn(column string, values any) *UpdateBuilder
- func (u *UpdateBuilder) WhereNotLike(column string, value any, caseSensitive ...bool) *UpdateBuilder
- func (u *UpdateBuilder) WhereNotNull(column string) *UpdateBuilder
- func (u *UpdateBuilder) WhereNull(column string) *UpdateBuilder
- func (u *UpdateBuilder) WhereNullSafeEquals(column string, value any) *UpdateBuilder
- func (u *UpdateBuilder) WhereRaw(sql string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereRowValues(columns []string, op string, values []any) *UpdateBuilder
- func (u *UpdateBuilder) WhereTime(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) WhereValueBetween(value any, c1 string, c2 string) *UpdateBuilder
- func (u *UpdateBuilder) WhereValueNotBetween(value any, c1 string, c2 string) *UpdateBuilder
- func (u *UpdateBuilder) WhereYear(column string, args ...any) *UpdateBuilder
- func (u *UpdateBuilder) With(name string, q *SelectBuilder, opts ...CTEOption) *UpdateBuilder
- func (u *UpdateBuilder) WithRaw(name string, e Expression, opts ...CTEOption) *UpdateBuilder
- func (u *UpdateBuilder) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *UpdateBuilder
- type WhereClause
- func (w *WhereClause) OrWhere(column string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereAll(columns []string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereAny(columns []string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereBetween(column string, lo any, hi any) *WhereClause
- func (w *WhereClause) OrWhereBetweenColumns(column string, c1 string, c2 string) *WhereClause
- func (w *WhereClause) OrWhereColumn(first string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereDate(column string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereDay(column string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereExists(sub *SelectBuilder) *WhereClause
- func (w *WhereClause) OrWhereGroup(fn func(*WhereClause)) *WhereClause
- func (w *WhereClause) OrWhereIn(column string, values any) *WhereClause
- func (w *WhereClause) OrWhereIntegerInRaw(column string, values any) *WhereClause
- func (w *WhereClause) OrWhereIntegerNotInRaw(column string, values any) *WhereClause
- func (w *WhereClause) OrWhereJsonContains(column string, value any) *WhereClause
- func (w *WhereClause) OrWhereJsonContainsKey(column string) *WhereClause
- func (w *WhereClause) OrWhereJsonDoesntContain(column string, value any) *WhereClause
- func (w *WhereClause) OrWhereJsonDoesntContainKey(column string) *WhereClause
- func (w *WhereClause) OrWhereJsonDoesntOverlap(column string, value any) *WhereClause
- func (w *WhereClause) OrWhereJsonLength(column string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereJsonOverlaps(column string, value any) *WhereClause
- func (w *WhereClause) OrWhereLike(column string, value any, caseSensitive ...bool) *WhereClause
- func (w *WhereClause) OrWhereMap(m map[string]any) *WhereClause
- func (w *WhereClause) OrWhereMonth(column string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereNone(columns []string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereNot(column string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereNotBetween(column string, lo any, hi any) *WhereClause
- func (w *WhereClause) OrWhereNotBetweenColumns(column string, c1 string, c2 string) *WhereClause
- func (w *WhereClause) OrWhereNotExists(sub *SelectBuilder) *WhereClause
- func (w *WhereClause) OrWhereNotIn(column string, values any) *WhereClause
- func (w *WhereClause) OrWhereNotLike(column string, value any, caseSensitive ...bool) *WhereClause
- func (w *WhereClause) OrWhereNotNull(column string) *WhereClause
- func (w *WhereClause) OrWhereNull(column string) *WhereClause
- func (w *WhereClause) OrWhereNullSafeEquals(column string, value any) *WhereClause
- func (w *WhereClause) OrWhereRaw(sql string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereRowValues(columns []string, op string, values []any) *WhereClause
- func (w *WhereClause) OrWhereTime(column string, args ...any) *WhereClause
- func (w *WhereClause) OrWhereValueBetween(value any, c1 string, c2 string) *WhereClause
- func (w *WhereClause) OrWhereValueNotBetween(value any, c1 string, c2 string) *WhereClause
- func (w *WhereClause) OrWhereYear(column string, args ...any) *WhereClause
- func (w *WhereClause) Where(column string, args ...any) *WhereClause
- func (w *WhereClause) WhereAll(columns []string, args ...any) *WhereClause
- func (w *WhereClause) WhereAny(columns []string, args ...any) *WhereClause
- func (w *WhereClause) WhereBetween(column string, lo any, hi any) *WhereClause
- func (w *WhereClause) WhereBetweenColumns(column string, c1 string, c2 string) *WhereClause
- func (w *WhereClause) WhereColumn(first string, args ...any) *WhereClause
- func (w *WhereClause) WhereDate(column string, args ...any) *WhereClause
- func (w *WhereClause) WhereDay(column string, args ...any) *WhereClause
- func (w *WhereClause) WhereExists(sub *SelectBuilder) *WhereClause
- func (w *WhereClause) WhereGroup(fn func(*WhereClause)) *WhereClause
- func (w *WhereClause) WhereIn(column string, values any) *WhereClause
- func (w *WhereClause) WhereIntegerInRaw(column string, values any) *WhereClause
- func (w *WhereClause) WhereIntegerNotInRaw(column string, values any) *WhereClause
- func (w *WhereClause) WhereJsonContains(column string, value any) *WhereClause
- func (w *WhereClause) WhereJsonContainsKey(column string) *WhereClause
- func (w *WhereClause) WhereJsonDoesntContain(column string, value any) *WhereClause
- func (w *WhereClause) WhereJsonDoesntContainKey(column string) *WhereClause
- func (w *WhereClause) WhereJsonDoesntOverlap(column string, value any) *WhereClause
- func (w *WhereClause) WhereJsonLength(column string, args ...any) *WhereClause
- func (w *WhereClause) WhereJsonOverlaps(column string, value any) *WhereClause
- func (w *WhereClause) WhereLike(column string, value any, caseSensitive ...bool) *WhereClause
- func (w *WhereClause) WhereMap(m map[string]any) *WhereClause
- func (w *WhereClause) WhereMonth(column string, args ...any) *WhereClause
- func (w *WhereClause) WhereNone(columns []string, args ...any) *WhereClause
- func (w *WhereClause) WhereNot(column string, args ...any) *WhereClause
- func (w *WhereClause) WhereNotBetween(column string, lo any, hi any) *WhereClause
- func (w *WhereClause) WhereNotBetweenColumns(column string, c1 string, c2 string) *WhereClause
- func (w *WhereClause) WhereNotExists(sub *SelectBuilder) *WhereClause
- func (w *WhereClause) WhereNotIn(column string, values any) *WhereClause
- func (w *WhereClause) WhereNotLike(column string, value any, caseSensitive ...bool) *WhereClause
- func (w *WhereClause) WhereNotNull(column string) *WhereClause
- func (w *WhereClause) WhereNull(column string) *WhereClause
- func (w *WhereClause) WhereNullSafeEquals(column string, value any) *WhereClause
- func (w *WhereClause) WhereRaw(sql string, args ...any) *WhereClause
- func (w *WhereClause) WhereRowValues(columns []string, op string, values []any) *WhereClause
- func (w *WhereClause) WhereTime(column string, args ...any) *WhereClause
- func (w *WhereClause) WhereValueBetween(value any, c1 string, c2 string) *WhereClause
- func (w *WhereClause) WhereValueNotBetween(value any, c1 string, c2 string) *WhereClause
- func (w *WhereClause) WhereYear(column string, args ...any) *WhereClause
Constants ¶
This section is empty.
Variables ¶
var ( // ErrNotFound is returned by First/Find/Sole/Value when no row matches. // It is sql.ErrNoRows, so errors.Is(err, sql.ErrNoRows) also works. ErrNotFound = sql.ErrNoRows // ErrMultipleRecords is returned by Sole when more than one row matches. ErrMultipleRecords = errors.New("quill: multiple records found") // ErrNoOrder is returned by Chunk when the query has no ORDER BY. ErrNoOrder = errors.New("quill: chunking requires an order by clause") // ErrNotBound is returned when running a query on a DB that has no connection, // such as one from Use. Create the DB with New(conn, dialect) to execute queries. ErrNotBound = errors.New("quill: no database connection; create the DB with db.New(conn, dialect) to run queries") // ErrNoTransaction is returned by Transaction when the connection cannot begin one. ErrNoTransaction = errors.New("quill: connection cannot begin transactions") )
var ( // ErrUnknownDialect is returned when the Dialect is not one of the supported values. ErrUnknownDialect = errors.New("quill: unknown dialect") // ErrInvalidOperator is returned for a comparison operator outside the allow-list. ErrInvalidOperator = errors.New("quill: invalid operator") // ErrInvalidDirection is returned when an order direction is not "asc" or "desc". ErrInvalidDirection = errors.New("quill: order direction must be asc or desc") // ErrNoTable is returned when a query is built without a table or subquery source. ErrNoTable = errors.New("quill: no table specified") // ErrInvalidArgs is returned for arguments the library cannot use, such as a wrong // argument count, a non-struct passed to a struct write or a malformed cursor. ErrInvalidArgs = errs.ErrInvalidArgs // ErrUnsupported is returned when the dialect cannot express the feature, instead of // emitting SQL that behaves differently. ErrUnsupported = errors.New("quill: not supported by this dialect") // ErrJoinNeedsOn is returned for a join (other than a cross join) without an ON condition. ErrJoinNeedsOn = errors.New("quill: join requires an ON condition") // ErrNoValues is returned by a write that has no values to write. ErrNoValues = errors.New("quill: no values to write") // ErrNoWhere is returned by UpdateBuilder and DeleteBuilder without a WHERE or LIMIT // unless AllRows was called. ErrNoWhere = errors.New("quill: update/delete without a where clause; call AllRows() to confirm") )
Sentinel errors returned by the builder. Match them with errors.Is: most are wrapped with a message that names the offending argument.
Functions ¶
func PluckAs ¶
PluckAs returns one column of every row as []V.
Example:
ids, err := db.PluckAs[int64](ctx, conn.Select().From("users").OrderBy("id"), "id")
// SELECT "id" FROM "users" ORDER BY "id" ASC args: []
// ids: [1 2]
func Row ¶
Row converts a struct (or non-nil pointer to one) into a column map for the write methods, using the same `db` tags as scanning:
`db:"name"` column name (default: snake_case of the field name) `db:"name,omitempty"` skipped while the field holds its zero value `db:"-"` never written
Embedded structs are flattened and unexported fields are ignored. Fields behind a nil embedded pointer are treated like omitted zero values. Values are passed through untouched, so pointers (nil -> NULL), sql.Null* types and Raw expressions all work. A field that is omitted for being zero cannot be set to its zero value through a struct: use a pointer field or a map for that.
Example:
type Post struct {
ID int64 `db:"id,omitempty"`
Title string `db:"title"`
Notes string `db:"-"`
}
row, err := db.Row(Post{Title: "Hello", Notes: "internal"})
// row = map[title:Hello] (zero ID omitted, Notes never written)
func Stream ¶
Stream yields each row as T (struct, map[string]any or scalar) while holding one row in memory. Stop early by breaking out of the loop; the cursor is then closed. An error ends the sequence after being yielded once.
Example:
q := conn.Select().From("users").OrderBy("id")
for u, err := range db.Stream[User](ctx, q) {
if err != nil {
break
}
fmt.Println(u.ID, u.Name)
}
// SELECT * FROM "users" ORDER BY "id" ASC
// scalar rows: db.Stream[string](ctx, conn.Select().From("users").Select("name"))
func TableName ¶
TableName returns T's table from its TableName method. T may be a pointer type. It returns ErrInvalidArgs when T has no TableName method or it returns "".
Example:
type Order struct{ ID int64 }
func (Order) TableName() string { return "orders" }
name, err := db.TableName[Order]() // name = "orders"
_, err = db.TableName[struct{}]() // err wraps ErrInvalidArgs (no TableName method)
Types ¶
type CTEOption ¶ added in v0.2.0
type CTEOption func(*cteClause)
CTEOption tunes a common table expression added with With, WithRaw or WithRecursive.
func CTEColumns ¶ added in v0.2.0
CTEColumns names the columns of the CTE: "with name (a, b) as (...)".
Example:
conn.Select().From("a").With("a", conn.Select("id", "name").From("users"), db.CTEColumns("uid", "uname"))
// WITH "a" ("uid", "uname") AS (SELECT "id", "name" FROM "users") SELECT * FROM "a"
func CTEMaterialized ¶ added in v0.2.0
func CTEMaterialized() CTEOption
CTEMaterialized adds "as materialized": the CTE is computed once and reused. PostgreSQL 12+ and SQLite 3.35+; MySQL and MariaDB return ErrUnsupported. It cannot be combined with CTENotMaterialized.
Example:
recent := conn.Select().From("orders").Where("total", ">", 100)
conn.Select().From("recent").With("recent", recent, db.CTEMaterialized())
// WITH "recent" AS MATERIALIZED (SELECT * FROM "orders" WHERE "total" > $1) SELECT * FROM
// "recent"
// args: [100]
func CTENotMaterialized ¶ added in v0.2.0
func CTENotMaterialized() CTEOption
CTENotMaterialized adds "as not materialized": the CTE may be inlined into the outer query. PostgreSQL 12+ and SQLite 3.35+; MySQL and MariaDB return ErrUnsupported. It cannot be combined with CTEMaterialized.
Example:
recent := conn.Select().From("orders").Where("total", ">", 100)
conn.Select().From("recent").With("recent", recent, db.CTENotMaterialized())
// WITH "recent" AS NOT MATERIALIZED (SELECT * FROM "orders" WHERE "total" > $1) SELECT *
// FROM "recent"
// args: [100]
func CTEUnionDistinct ¶ added in v0.2.0
func CTEUnionDistinct() CTEOption
CTEUnionDistinct joins the anchor and the recursive member of WithRecursive with UNION (dropping duplicate rows) instead of UNION ALL.
Example:
conn.Select().From("tree").WithRecursive("tree", anchor, step, db.CTEUnionDistinct())
// WITH RECURSIVE "tree" AS (<anchor> UNION <step>) SELECT * FROM "tree"
type Conn ¶
type Conn interface {
QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
}
Conn is the subset of *sql.DB, *sql.Tx and *sql.Conn the executor needs.
Example:
sqlDB, err := sql.Open("pgx", dsn) // *sql.DB, *sql.Tx and *sql.Conn all satisfy Conn
conn := db.New(sqlDB, db.Postgres)
type CursorOptions ¶
CursorOptions selects the keyset column. Column must be unique and ordered (default "id"); ties would skip or repeat rows.
Example:
opt := db.CursorOptions{Column: "id", Desc: true}
p, err := conn.Select().From("orders").CursorPaginate(ctx, 5, "", &orders, opt)
// SELECT * FROM "orders" ORDER BY "id" DESC LIMIT 6
type CursorPage ¶
type CursorPage struct {
PerPage int
HasMore bool
NextCursor string // pass to the next CursorPaginate call; empty when !HasMore
}
CursorPage is a keyset pagination result.
Example:
var users []User
p, err := conn.Select().From("users").CursorPaginate(ctx, 10, "", &users)
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 11
// p.HasMore = false and p.NextCursor = "" when 10 or fewer rows remain
type CursorPaged ¶
type CursorPaged[T any] struct { CursorPage Items []T }
CursorPaged is a keyset page with its rows.
type DB ¶
type DB struct {
// contains filtered or unexported fields
}
DB executes statements against a connection. It is safe for concurrent use when the underlying Conn is (as *sql.DB is); a DB made by Transaction is not.
Example:
conn := db.New(sqlDB, db.Postgres)
n, err := conn.Select().From("users").Count(ctx)
func New ¶
New wraps conn (*sql.DB, *sql.Tx, *sql.Conn or any Conn) for the given dialect.
Example:
conn := db.New(sqlDB, db.Postgres, db.WithPrefix("app_")) // sqlDB is a *sql.DB
n, err := conn.Select().From("users").Count(ctx)
// SELECT COUNT(*) AS "aggregate" FROM "app_users"
func Use ¶
Use starts a connection-less DB for building SQL: set the dialect first, then chain from Select, Insert, Update or Delete:
sql, args, err := db.Use(db.Postgres).Select().From("users").Where("id", 7).ToSQL()
The same options as New apply (WithPrefix). Running a query on it returns ErrNotBound; create the DB with New to execute.
func (*DB) Delete ¶ added in v0.2.0
func (db *DB) Delete(table string) *DeleteBuilder
Delete starts a DELETE builder for table.
Example:
sqlText, args, err := conn.Delete("users").Where("id", 7).ToSQL()
// DELETE FROM "users" WHERE "id" = $1 args: [7]
func (*DB) Dialect ¶
Dialect returns the dialect this DB compiles for.
Example:
conn := db.Use(db.MySQL) conn.Dialect() == db.MySQL // true
func (*DB) Exec ¶
Exec runs a raw statement and returns the rows affected.
Example:
n, err := conn.Exec(ctx, "UPDATE users SET active = $1 WHERE id < $2", false, 4) // n = 3 rows affected
func (*DB) Insert ¶ added in v0.2.0
func (db *DB) Insert(table string) *InsertBuilder
Insert starts an INSERT builder for table.
Example:
sqlText, args, err := conn.Insert("users").Values(map[string]any{"name": "Ann"}).ToSQL()
// INSERT INTO "users" ("name") VALUES ($1) args: [Ann]
func (*DB) Query ¶
Query runs raw SQL (use the dialect's placeholders) and scans every row into dest, a pointer to a slice of structs, maps or scalars.
Example:
var users []User
err := conn.Query(ctx, &users, "SELECT id, name FROM users WHERE id = $1", 1)
// sends the text as given with args: [1]; users = [{1 ann}]
func (*DB) Select ¶ added in v0.2.0
func (db *DB) Select(columns ...string) *SelectBuilder
Select starts a SELECT builder; columns are optional (default *).
Example:
sqlText, args, err := conn.Select("id", "name").From("users").Where("id", 7).ToSQL()
// SELECT "id", "name" FROM "users" WHERE "id" = $1 args: [7]
func (*DB) Transaction ¶
Transaction runs fn in a transaction: commit on nil, rollback on error or panic (the panic is re-raised). Inside an existing transaction it uses a savepoint.
Example:
err := conn.Transaction(ctx, func(tx *db.DB) error {
_, err := tx.Exec(ctx, "UPDATE accounts SET balance = balance - $1 WHERE id = $2", 50, 1)
return err // nil commits, an error rolls back
})
// BEGIN, UPDATE ..., COMMIT
// nested call on tx: SAVEPOINT sp_1 ... RELEASE SAVEPOINT sp_1
func (*DB) TransactionOpts ¶
func (db *DB) TransactionOpts(ctx context.Context, opts *sql.TxOptions, fn func(tx *DB) error) (err error)
TransactionOpts is Transaction with sql.TxOptions (isolation level, read-only). opts is ignored for nested savepoints.
Example:
opts := &sql.TxOptions{Isolation: sql.LevelSerializable, ReadOnly: true}
err := conn.TransactionOpts(ctx, opts, func(tx *db.DB) error {
_, err := tx.Select().From("users").Count(ctx)
return err
})
func (*DB) Truncate ¶ added in v0.2.0
Truncate empties a table and resets its auto-increment counter. On SQLite this runs as DELETE plus a sqlite_sequence reset inside a transaction.
Example:
err := conn.Truncate(ctx, "sessions") // Postgres: TRUNCATE "sessions" RESTART IDENTITY MySQL: TRUNCATE TABLE `sessions`
func (*DB) TruncateSQL ¶ added in v0.2.0
TruncateSQL builds the statements Truncate runs, in order.
Example:
stmts, err := conn.TruncateSQL("sessions")
// Postgres: [TRUNCATE "sessions" RESTART IDENTITY]
func (*DB) Update ¶ added in v0.2.0
func (db *DB) Update(table string) *UpdateBuilder
Update starts an UPDATE builder for table.
Example:
sqlText, args, err := conn.Update("users").Set("name", "Ann").Where("id", 7).ToSQL()
// UPDATE "users" SET "name" = $1 WHERE "id" = $2 args: [Ann 7]
func (*DB) UpdateOrInsert ¶ added in v0.2.0
func (db *DB) UpdateOrInsert(ctx context.Context, table string, attributes, values map[string]any) (bool, error)
UpdateOrInsert updates the first row matching attributes with values, or inserts attributes merged with values when none matches. It reports whether the write succeeded.
Example:
ok, err := conn.UpdateOrInsert(ctx, "users",
map[string]any{"email": "ann@example.com"}, map[string]any{"name": "Ann"})
// SELECT EXISTS(SELECT * FROM "users" WHERE "email" = $1)
// then UPDATE "users" SET "name" = $1 WHERE "email" = $2 (LIMIT 1), or INSERT when absent
type DeleteBuilder ¶ added in v0.2.0
type DeleteBuilder struct {
// contains filtered or unexported fields
}
DeleteBuilder is a mutable DELETE statement. Start one with DB.Delete, narrow it with Where, and finish with Exec, Get or ToSQL. Without a WHERE or LIMIT it refuses to build (ErrNoWhere) unless AllRows was called. Not safe for concurrent use.
func (*DeleteBuilder) AllRows ¶ added in v0.2.0
func (d *DeleteBuilder) AllRows() *DeleteBuilder
AllRows confirms that an update/delete without a where clause is intended. Without it, an UpdateBuilder or DeleteBuilder refuses to build (ErrNoWhere).
Example:
conn.Delete("sessions").AllRows().ToSQL()
// DELETE FROM "sessions" args: []
func (*DeleteBuilder) Clone ¶ added in v0.2.0
func (d *DeleteBuilder) Clone() *DeleteBuilder
Clone returns an independent copy. Cloning a nil *DeleteBuilder returns nil.
Example:
base := conn.Delete("sessions").Where("expired", true)
old := base.Clone().Where("created_at", "<", cutoff)
func (*DeleteBuilder) CrossJoin ¶ added in v0.2.0
func (d *DeleteBuilder) CrossJoin(table string) *DeleteBuilder
CrossJoin adds "CROSS JOIN table".
Example:
conn.Select().From("users").CrossJoin("roles")
// SELECT * FROM "users" CROSS JOIN "roles"
func (*DeleteBuilder) CrossJoinSub ¶ added in v0.2.0
func (d *DeleteBuilder) CrossJoinSub(sub *SelectBuilder, as string) *DeleteBuilder
CrossJoinSub cross joins a subquery.
Example:
sub := conn.Select().From("roles").Select("name").Where("active", true)
conn.Select().From("users").CrossJoinSub(sub, "r")
// SELECT * FROM "users" CROSS JOIN (SELECT "name" FROM "roles" WHERE "active" = $1) AS "r"
// args: [true]
func (*DeleteBuilder) Err ¶ added in v0.2.0
func (d *DeleteBuilder) Err() error
Err returns the first error recorded while building.
Example:
q := conn.Select().From("users").Where("id", "!!", 1)
err := q.Err()
// err: quill: invalid operator: "!!"
func (*DeleteBuilder) Exec ¶ added in v0.2.0
func (d *DeleteBuilder) Exec(ctx context.Context) (int64, error)
Exec runs the delete and returns the rows affected.
Example:
n, err := conn.Delete("users").Where("id", 7).Exec(ctx)
// DELETE FROM "users" WHERE "id" = $1 args: [7]
func (*DeleteBuilder) Get ¶ added in v0.2.0
func (d *DeleteBuilder) Get(ctx context.Context, dest any) error
Get runs the delete and scans the RETURNING rows into dest. Call Returning first.
Example:
var gone []User
err := conn.Delete("users").Where("id", 7).Returning("*").Get(ctx, &gone)
// DELETE FROM "users" WHERE "id" = $1 RETURNING * args: [7]
func (*DeleteBuilder) InRandomOrder ¶ added in v0.2.0
func (d *DeleteBuilder) InRandomOrder(seed ...int) *DeleteBuilder
InRandomOrder orders randomly: RANDOM() on Postgres/SQLite, RAND([seed]) on MySQL.
Example:
conn.Select().From("posts").InRandomOrder().Limit(5)
// Postgres: SELECT * FROM "posts" ORDER BY RANDOM() LIMIT 5
// MySQL: SELECT * FROM `posts` ORDER BY RAND() LIMIT 5
func (*DeleteBuilder) Join ¶ added in v0.2.0
func (d *DeleteBuilder) Join(table string, first string, args ...any) *DeleteBuilder
Join adds "INNER JOIN table ON first = second" (or "first op second").
Example:
conn.Select().From("users as u").Join("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*DeleteBuilder) JoinFunc ¶ added in v0.2.0
func (d *DeleteBuilder) JoinFunc(table string, fn func(*JoinClause)) *DeleteBuilder
JoinFunc adds an inner join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.published", true)
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."published" = $1
// args: [true]
func (*DeleteBuilder) JoinLateral ¶ added in v0.2.0
func (d *DeleteBuilder) JoinLateral(sub *SelectBuilder, as string) *DeleteBuilder
JoinLateral adds "INNER JOIN LATERAL (subquery) AS alias ON TRUE" (Postgres, MySQL >= 8.0.14).
Example:
recent := conn.Select().From("posts").Select("id", "title").
WhereColumn("posts.user_id", "u.id").Limit(1)
conn.Select().From("users as u").JoinLateral(recent, "rp")
// SELECT * FROM "users" AS "u" INNER JOIN LATERAL (SELECT "id", "title" FROM "posts" WHERE
// "posts"."user_id" = "u"."id" LIMIT 1) AS "rp" ON TRUE
// MariaDB returns ErrUnsupported
func (*DeleteBuilder) JoinSub ¶ added in v0.2.0
func (d *DeleteBuilder) JoinSub(sub *SelectBuilder, as string, first string, args ...any) *DeleteBuilder
JoinSub joins a subquery: "INNER JOIN (SELECT ...) AS alias ON ...".
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").JoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" INNER JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1)
// AS "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*DeleteBuilder) JoinSubFunc ¶ added in v0.2.0
func (d *DeleteBuilder) JoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *DeleteBuilder
JoinSubFunc joins a subquery with a complex ON clause built in fn.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").JoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.score", ">", 10)
})
// SELECT * FROM "users" AS "u" INNER JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id" AND "p"."score" > $1
// args: [10]
func (*DeleteBuilder) JoinWhere ¶ added in v0.2.0
func (d *DeleteBuilder) JoinWhere(table string, column string, args ...any) *DeleteBuilder
JoinWhere joins on a bound value: "INNER JOIN t ON col = ?".
Example:
conn.Select().From("users as u").JoinWhere("posts as p", "p.status", "published")
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."status" = $1
// args: [published]
func (*DeleteBuilder) Latest ¶ added in v0.2.0
func (d *DeleteBuilder) Latest(column ...string) *DeleteBuilder
Latest orders by column descending (default "created_at").
Example:
conn.Select().From("posts").Latest("published_at")
// SELECT * FROM "posts" ORDER BY "published_at" DESC
func (*DeleteBuilder) LeftJoin ¶ added in v0.2.0
func (d *DeleteBuilder) LeftJoin(table string, first string, args ...any) *DeleteBuilder
LeftJoin adds a left join.
Example:
conn.Select().From("users as u").LeftJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*DeleteBuilder) LeftJoinFunc ¶ added in v0.2.0
func (d *DeleteBuilder) LeftJoinFunc(table string, fn func(*JoinClause)) *DeleteBuilder
LeftJoinFunc adds a left join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").LeftJoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNull("p.deleted_at")
})
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."deleted_at" IS NULL
func (*DeleteBuilder) LeftJoinLateral ¶ added in v0.2.0
func (d *DeleteBuilder) LeftJoinLateral(sub *SelectBuilder, as string) *DeleteBuilder
LeftJoinLateral is JoinLateral as a left join.
Example:
recent := conn.Select().From("posts").Select("id", "title").
WhereColumn("posts.user_id", "u.id").Limit(1)
conn.Select().From("users as u").LeftJoinLateral(recent, "rp")
// SELECT * FROM "users" AS "u" LEFT JOIN LATERAL (SELECT "id", "title" FROM "posts" WHERE
// "posts"."user_id" = "u"."id" LIMIT 1) AS "rp" ON TRUE
func (*DeleteBuilder) LeftJoinSub ¶ added in v0.2.0
func (d *DeleteBuilder) LeftJoinSub(sub *SelectBuilder, as string, first string, args ...any) *DeleteBuilder
LeftJoinSub joins a subquery with a left join.
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").LeftJoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" LEFT JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1) AS
// "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*DeleteBuilder) LeftJoinSubFunc ¶ added in v0.2.0
func (d *DeleteBuilder) LeftJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *DeleteBuilder
LeftJoinSubFunc is JoinSubFunc as a left join.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").LeftJoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNotNull("p.score")
})
// SELECT * FROM "users" AS "u" LEFT JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id" AND "p"."score" IS NOT NULL
func (*DeleteBuilder) LeftJoinWhere ¶ added in v0.2.0
func (d *DeleteBuilder) LeftJoinWhere(table string, column string, args ...any) *DeleteBuilder
LeftJoinWhere is JoinWhere as a left join.
Example:
conn.Select().From("users as u").LeftJoinWhere("posts as p", "p.score", ">", 10)
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."score" > $1
// args: [10]
func (*DeleteBuilder) Limit ¶ added in v0.2.0
func (d *DeleteBuilder) Limit(n int) *DeleteBuilder
Limit sets LIMIT; negative values are ignored.
Example:
conn.Select().From("users").Limit(10)
// SELECT * FROM "users" LIMIT 10
func (*DeleteBuilder) Oldest ¶ added in v0.2.0
func (d *DeleteBuilder) Oldest(column ...string) *DeleteBuilder
Oldest orders by column ascending (default "created_at").
Example:
conn.Select().From("posts").Oldest()
// SELECT * FROM "posts" ORDER BY "created_at" ASC
func (*DeleteBuilder) OrWhere ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhere(column string, args ...any) *DeleteBuilder
OrWhere is Where joined with OR.
Example:
conn.Select().From("users").Where("role", "admin").OrWhere("role", "owner")
// SELECT * FROM "users" WHERE "role" = $1 OR "role" = $2
// args: [admin owner]
func (*DeleteBuilder) OrWhereAll ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereAll(columns []string, args ...any) *DeleteBuilder
OrWhereAll is WhereAll joined with OR.
Example:
conn.Select().From("users").WhereAll([]string{"a", "b"}, 1).OrWhereAll([]string{"c", "d"}, ">", 5)
// SELECT * FROM "users" WHERE ("a" = $1 AND "b" = $2) OR ("c" > $3 AND "d" > $4)
// args: [1 1 5 5]
func (*DeleteBuilder) OrWhereAny ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereAny(columns []string, args ...any) *DeleteBuilder
OrWhereAny is WhereAny joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereAny([]string{"a", "b"}, ">", 5)
// SELECT * FROM "users" WHERE "active" = $1 OR ("a" > $2 OR "b" > $3) args: [true 5 5]
func (*DeleteBuilder) OrWhereBetween ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereBetween(column string, lo any, hi any) *DeleteBuilder
OrWhereBetween is WhereBetween joined with OR.
Example:
conn.Select().From("orders").Where("status", "paid").OrWhereBetween("total", 500, 900)
// SELECT * FROM "orders" WHERE "status" = $1 OR "total" BETWEEN $2 AND $3
// args: [paid 500 900]
func (*DeleteBuilder) OrWhereBetweenColumns ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereBetweenColumns(column string, c1 string, c2 string) *DeleteBuilder
OrWhereBetweenColumns is WhereBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price").
OrWhereBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price" OR "cost"
// BETWEEN "low" AND "high"
func (*DeleteBuilder) OrWhereColumn ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereColumn(first string, args ...any) *DeleteBuilder
OrWhereColumn is WhereColumn joined with OR.
Example:
conn.Select().From("users").WhereColumn("first_name", "last_name").OrWhereColumn("a", "<>", "b")
// SELECT * FROM "users" WHERE "first_name" = "last_name" OR "a" <> "b"
func (*DeleteBuilder) OrWhereDate ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereDate(column string, args ...any) *DeleteBuilder
OrWhereDate is WhereDate joined with OR.
Example:
conn.Select().From("orders").WhereDate("created_at", "2024-01-15").
OrWhereDate("created_at", "2024-02-01")
// SELECT * FROM "orders" WHERE "created_at"::DATE = $1 OR "created_at"::DATE = $2
// args: [2024-01-15 2024-02-01]
func (*DeleteBuilder) OrWhereDay ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereDay(column string, args ...any) *DeleteBuilder
OrWhereDay is WhereDay joined with OR.
Example:
conn.Select().From("orders").WhereDay("created_at", 15).OrWhereDay("created_at", ">", 20)
// SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 OR EXTRACT(DAY FROM
// "created_at") > $2
// args: [15 20]
func (*DeleteBuilder) OrWhereExists ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereExists(sub *SelectBuilder) *DeleteBuilder
OrWhereExists is WhereExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*DeleteBuilder) OrWhereGroup ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereGroup(fn func(*WhereClause)) *DeleteBuilder
OrWhereGroup is WhereGroup joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").Where("age", ">", 30)
})
// SELECT * FROM "users" WHERE "active" = $1 OR ("role" = $2 AND "age" > $3)
// args: [true admin 30]
func (*DeleteBuilder) OrWhereIn ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereIn(column string, values any) *DeleteBuilder
OrWhereIn is WhereIn joined with OR.
Example:
conn.Select().From("users").WhereIn("role", []string{"ann", "bob"}).OrWhereIn("id", []int{9})
// SELECT * FROM "users" WHERE "role" IN ($1, $2) OR "id" IN ($3) args: [ann bob 9]
func (*DeleteBuilder) OrWhereIntegerInRaw ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereIntegerInRaw(column string, values any) *DeleteBuilder
OrWhereIntegerInRaw is WhereIntegerInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1}).
OrWhereIntegerInRaw("id", []int64{7, 8})
// SELECT * FROM "users" WHERE "id" IN (1) OR "id" IN (7, 8)
func (*DeleteBuilder) OrWhereIntegerNotInRaw ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereIntegerNotInRaw(column string, values any) *DeleteBuilder
OrWhereIntegerNotInRaw is WhereIntegerNotInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2}).
OrWhereIntegerNotInRaw("id", []int{3})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2) OR "id" NOT IN (3)
func (*DeleteBuilder) OrWhereJsonContains ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereJsonContains(column string, value any) *DeleteBuilder
OrWhereJsonContains is WhereJsonContains joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR ("options"->'tags')::JSONB @> $2
// args: [true "go"]
func (*DeleteBuilder) OrWhereJsonContainsKey ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereJsonContainsKey(column string) *DeleteBuilder
OrWhereJsonContainsKey is WhereJsonContainsKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*DeleteBuilder) OrWhereJsonDoesntContain ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereJsonDoesntContain(column string, value any) *DeleteBuilder
OrWhereJsonDoesntContain is WhereJsonDoesntContain joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("options"->'tags')::JSONB @> $2
// args: [true "php"]
func (*DeleteBuilder) OrWhereJsonDoesntContainKey ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereJsonDoesntContainKey(column string) *DeleteBuilder
OrWhereJsonDoesntContainKey is WhereJsonDoesntContainKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).
OrWhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1
// OR NOT COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*DeleteBuilder) OrWhereJsonDoesntOverlap ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereJsonDoesntOverlap(column string, value any) *DeleteBuilder
OrWhereJsonDoesntOverlap is WhereJsonDoesntOverlap joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["php"]]
func (*DeleteBuilder) OrWhereJsonLength ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereJsonLength(column string, args ...any) *DeleteBuilder
OrWhereJsonLength is WhereJsonLength joined with OR.
Example:
conn.Select().From("users").WhereJsonLength("options->tags", 0)
.OrWhereJsonLength("options->roles", ">=", 3).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// OR JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) >= $2 args: [0 3]
func (*DeleteBuilder) OrWhereJsonOverlaps ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereJsonOverlaps(column string, value any) *DeleteBuilder
OrWhereJsonOverlaps is WhereJsonOverlaps joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonOverlaps("options->tags", []string{"go"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["go"]]
func (*DeleteBuilder) OrWhereLike ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereLike(column string, value any, caseSensitive ...bool) *DeleteBuilder
OrWhereLike is WhereLike joined with OR.
Example:
conn.Select().From("users").WhereLike("name", "an%").OrWhereLike("name", "bo%")
// SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 OR "name"::TEXT ILIKE $2
// args: [an% bo%]
func (*DeleteBuilder) OrWhereMap ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereMap(m map[string]any) *DeleteBuilder
OrWhereMap is WhereMap joined with OR.
Example:
conn.Select().From("users").WhereMap(map[string]any{"a": 1}).OrWhereMap(map[string]any{"b": 2})
// SELECT * FROM "users" WHERE ("a" = $1) OR ("b" = $2) args: [1 2]
func (*DeleteBuilder) OrWhereMonth ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereMonth(column string, args ...any) *DeleteBuilder
OrWhereMonth is WhereMonth joined with OR.
Example:
conn.Select().From("orders").WhereMonth("created_at", ">=", 6).OrWhereMonth("created_at", 1)
// SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") >= $1 OR EXTRACT(MONTH FROM
// "created_at") = $2
// args: [06 01]
func (*DeleteBuilder) OrWhereNone ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNone(columns []string, args ...any) *DeleteBuilder
OrWhereNone is WhereNone joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereNone([]string{"a", "b"}, 0)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("a" = $2 OR "b" = $3)
// args: [true 0 0]
func (*DeleteBuilder) OrWhereNot ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNot(column string, args ...any) *DeleteBuilder
OrWhereNot adds "OR NOT <predicate>".
Example:
conn.Select().From("users").Where("age", ">", 18).OrWhereNot("status", "<", 3)
// SELECT * FROM "users" WHERE "age" > $1 OR NOT "status" < $2 args: [18 3]
func (*DeleteBuilder) OrWhereNotBetween ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNotBetween(column string, lo any, hi any) *DeleteBuilder
OrWhereNotBetween is WhereNotBetween joined with OR.
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100).OrWhereNotBetween("qty", 1, 5)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 OR "qty" NOT BETWEEN $3 AND $4
// args: [10 100 1 5]
func (*DeleteBuilder) OrWhereNotBetweenColumns ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNotBetweenColumns(column string, c1 string, c2 string) *DeleteBuilder
OrWhereNotBetweenColumns is WhereNotBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price").
OrWhereNotBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price" OR "cost"
// NOT BETWEEN "low" AND "high"
func (*DeleteBuilder) OrWhereNotExists ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNotExists(sub *SelectBuilder) *DeleteBuilder
OrWhereNotExists is WhereNotExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereNotExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*DeleteBuilder) OrWhereNotIn ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNotIn(column string, values any) *DeleteBuilder
OrWhereNotIn is WhereNotIn joined with OR.
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2}).OrWhereNotIn("role", []string{"ann"})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) OR "role" NOT IN ($3) args: [1 2 ann]
func (*DeleteBuilder) OrWhereNotLike ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNotLike(column string, value any, caseSensitive ...bool) *DeleteBuilder
OrWhereNotLike is WhereNotLike joined with OR.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%").OrWhereNotLike("name", "%demo%", true)
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 OR "name"::TEXT NOT LIKE $2
// args: [%test% %demo%]
func (*DeleteBuilder) OrWhereNotNull ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNotNull(column string) *DeleteBuilder
OrWhereNotNull is WhereNotNull joined with OR.
Example:
conn.Select().From("users").WhereNotNull("verified_at").OrWhereNotNull("invited_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL OR "invited_at" IS NOT NULL
func (*DeleteBuilder) OrWhereNull ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNull(column string) *DeleteBuilder
OrWhereNull is WhereNull joined with OR.
Example:
conn.Select().From("users").WhereNull("deleted_at").OrWhereNull("banned_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL OR "banned_at" IS NULL
func (*DeleteBuilder) OrWhereNullSafeEquals ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereNullSafeEquals(column string, value any) *DeleteBuilder
OrWhereNullSafeEquals is WhereNullSafeEquals joined with OR.
Example:
conn.Select().From("users").WhereNullSafeEquals("a", 1).OrWhereNullSafeEquals("b", 2)
// SELECT * FROM "users" WHERE "a" IS NOT DISTINCT FROM $1 OR "b" IS NOT DISTINCT FROM $2
// args: [1 2]
func (*DeleteBuilder) OrWhereRaw ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereRaw(sql string, args ...any) *DeleteBuilder
OrWhereRaw is WhereRaw joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereRaw("age between ? and ?", 18, 30)
// SELECT * FROM "users" WHERE "active" = $1 OR age between $2 and $3
// args: [true 18 30]
func (*DeleteBuilder) OrWhereRowValues ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereRowValues(columns []string, op string, values []any) *DeleteBuilder
OrWhereRowValues is WhereRowValues joined with OR.
Example:
conn.Select().From("events").Where("kind", "x").
OrWhereRowValues([]string{"a", "b"}, "=", []any{1, 2})
// SELECT * FROM "events" WHERE "kind" = $1 OR ("a", "b") = ($2, $3) args: [x 1 2]
func (*DeleteBuilder) OrWhereTime ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereTime(column string, args ...any) *DeleteBuilder
OrWhereTime is WhereTime joined with OR.
Example:
conn.Select().From("orders").WhereTime("created_at", "10:30:00").
OrWhereTime("created_at", "<", "08:00:00")
// SELECT * FROM "orders" WHERE "created_at"::TIME = $1 OR "created_at"::TIME < $2
// args: [10:30:00 08:00:00]
func (*DeleteBuilder) OrWhereValueBetween ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereValueBetween(value any, c1 string, c2 string) *DeleteBuilder
OrWhereValueBetween is WhereValueBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total").
OrWhereValueBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" OR $2 BETWEEN "a" AND
// "b"
// args: [50 7]
func (*DeleteBuilder) OrWhereValueNotBetween ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereValueNotBetween(value any, c1 string, c2 string) *DeleteBuilder
OrWhereValueNotBetween is WhereValueNotBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total").
OrWhereValueNotBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" OR $2 NOT BETWEEN
// "a" AND "b"
// args: [50 7]
func (*DeleteBuilder) OrWhereYear ¶ added in v0.2.0
func (d *DeleteBuilder) OrWhereYear(column string, args ...any) *DeleteBuilder
OrWhereYear is WhereYear joined with OR.
Example:
conn.Select().From("orders").WhereYear("created_at", ">", 2020).OrWhereYear("created_at", 1999)
// SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") > $1 OR EXTRACT(YEAR FROM
// "created_at") = $2
// args: [2020 1999]
func (*DeleteBuilder) OrderBy ¶ added in v0.2.0
func (d *DeleteBuilder) OrderBy(column string, direction ...string) *DeleteBuilder
OrderBy adds ORDER BY column; direction is "asc" (default) or "desc".
Example:
conn.Select().From("users").OrderBy("name").OrderBy("age", "desc")
// SELECT * FROM "users" ORDER BY "name" ASC, "age" DESC
func (*DeleteBuilder) OrderByDesc ¶ added in v0.2.0
func (d *DeleteBuilder) OrderByDesc(column string) *DeleteBuilder
OrderByDesc is OrderBy(column, "desc").
Example:
conn.Select().From("users").OrderByDesc("created_at")
// SELECT * FROM "users" ORDER BY "created_at" DESC
func (*DeleteBuilder) OrderByRaw ¶ added in v0.2.0
func (d *DeleteBuilder) OrderByRaw(sql string, args ...any) *DeleteBuilder
OrderByRaw adds a raw ORDER BY expression (caller-trusted SQL).
Example:
conn.Select().From("users").OrderByRaw("case when role = ? then 0 else 1 end", "admin")
// SELECT * FROM "users" ORDER BY case when role = $1 then 0 else 1 end
// args: [admin]
func (*DeleteBuilder) Prefix ¶ added in v0.2.0
func (d *DeleteBuilder) Prefix(p string) *DeleteBuilder
Prefix sets a table prefix applied to table names, aliases and qualified columns.
Example:
db.Use(db.Postgres).Select("u.id").From("users as u").Prefix("app_")
// SELECT "app_u"."id" FROM "app_users" AS "app_u"
func (*DeleteBuilder) Reorder ¶ added in v0.2.0
func (d *DeleteBuilder) Reorder() *DeleteBuilder
Reorder removes all existing ORDER BY clauses (including a union's).
Example:
conn.Select().From("posts").OrderBy("title").Reorder()
// SELECT * FROM "posts"
func (*DeleteBuilder) ReorderBy ¶ added in v0.2.0
func (d *DeleteBuilder) ReorderBy(column string, direction ...string) *DeleteBuilder
ReorderBy is Reorder followed by OrderBy(column, direction).
Example:
conn.Select().From("posts").OrderBy("title").ReorderBy("id", "desc")
// SELECT * FROM "posts" ORDER BY "id" DESC
func (*DeleteBuilder) Returning ¶ added in v0.2.0
func (d *DeleteBuilder) Returning(columns ...string) *DeleteBuilder
Returning adds a RETURNING clause to insert/update/delete/upsert (Postgres, SQLite >= 3.35; MySQL returns ErrUnsupported). "*" is allowed.
Example:
conn.Insert("users").Values(map[string]any{"name": "Ann"}).Returning("id", "created_at").ToSQL()
// INSERT INTO "users" ("name") VALUES ($1) RETURNING "id", "created_at" args: [Ann]
// MySQL: ToSQL returns ErrUnsupported
func (*DeleteBuilder) RightJoin ¶ added in v0.2.0
func (d *DeleteBuilder) RightJoin(table string, first string, args ...any) *DeleteBuilder
RightJoin adds a right join.
Example:
conn.Select().From("users as u").RightJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*DeleteBuilder) RightJoinFunc ¶ added in v0.2.0
func (d *DeleteBuilder) RightJoinFunc(table string, fn func(*JoinClause)) *DeleteBuilder
RightJoinFunc adds a right join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").RightJoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.score", ">", 10)
})
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."score" > $1
// args: [10]
func (*DeleteBuilder) RightJoinSub ¶ added in v0.2.0
func (d *DeleteBuilder) RightJoinSub(sub *SelectBuilder, as string, first string, args ...any) *DeleteBuilder
RightJoinSub joins a subquery with a right join.
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").RightJoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" RIGHT JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1)
// AS "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*DeleteBuilder) RightJoinSubFunc ¶ added in v0.2.0
func (d *DeleteBuilder) RightJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *DeleteBuilder
RightJoinSubFunc is JoinSubFunc as a right join.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").RightJoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id")
})
// SELECT * FROM "users" AS "u" RIGHT JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id"
func (*DeleteBuilder) RightJoinWhere ¶ added in v0.2.0
func (d *DeleteBuilder) RightJoinWhere(table string, column string, args ...any) *DeleteBuilder
RightJoinWhere is JoinWhere as a right join.
Example:
conn.Select().From("users as u").RightJoinWhere("posts as p", "p.status", "published")
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."status" = $1
// args: [published]
func (*DeleteBuilder) StraightJoin ¶ added in v0.2.0
func (d *DeleteBuilder) StraightJoin(table string, first string, args ...any) *DeleteBuilder
StraightJoin adds a MySQL "straight_join"; other dialects error at compile time.
Example:
connMy.Select().From("users as u").StraightJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM `users` AS `u` STRAIGHT_JOIN `posts` AS `p` ON `p`.`user_id` = `u`.`id`
// connMy is db.Use(db.MySQL); other dialects return ErrUnsupported
func (*DeleteBuilder) Take ¶ added in v0.2.0
func (d *DeleteBuilder) Take(n int) *DeleteBuilder
Take is an alias of Limit.
Example:
conn.Select().From("users").Take(5)
// SELECT * FROM "users" LIMIT 5
func (*DeleteBuilder) ToSQL ¶ added in v0.2.0
func (d *DeleteBuilder) ToSQL() (string, []any, error)
ToSQL compiles the DELETE into SQL text and its ordered bind arguments. Joins use "DELETE alias FROM ... JOIN" on MySQL and a ctid/rowid subquery on Postgres/SQLite.
Example:
sqlText, args, err := conn.Delete("users").Where("id", 7).ToSQL()
// DELETE FROM "users" WHERE "id" = $1 args: [7]
func (*DeleteBuilder) Where ¶ added in v0.2.0
func (d *DeleteBuilder) Where(column string, args ...any) *DeleteBuilder
Where adds an AND predicate. Forms: Where(col, value) means "="; Where(col, op, value). A nil value with "=" / "!=" / "<>" becomes IS [NOT] NULL.
Example:
conn.Select().From("users").Where("active", true).Where("age", ">=", 18)
// SELECT * FROM "users" WHERE "active" = $1 AND "age" >= $2
// args: [true 18]
func (*DeleteBuilder) WhereAll ¶ added in v0.2.0
func (d *DeleteBuilder) WhereAll(columns []string, args ...any) *DeleteBuilder
WhereAll requires the predicate to hold for every column: (a = ? and b = ?).
Example:
conn.Select().From("users").WhereAll([]string{"first_name", "last_name"}, "like", "an%")
// SELECT * FROM "users" WHERE ("first_name"::TEXT LIKE $1 AND "last_name"::TEXT LIKE $2)
// args: [an% an%]
func (*DeleteBuilder) WhereAny ¶ added in v0.2.0
func (d *DeleteBuilder) WhereAny(columns []string, args ...any) *DeleteBuilder
WhereAny requires the predicate to hold for at least one column: (a = ? or b = ?).
Example:
conn.Select().From("users").WhereAny([]string{"first_name", "last_name"}, "ann")
// SELECT * FROM "users" WHERE ("first_name" = $1 OR "last_name" = $2) args: [ann ann]
func (*DeleteBuilder) WhereBetween ¶ added in v0.2.0
func (d *DeleteBuilder) WhereBetween(column string, lo any, hi any) *DeleteBuilder
WhereBetween adds "col BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" BETWEEN $1 AND $2 args: [10 100]
func (*DeleteBuilder) WhereBetweenColumns ¶ added in v0.2.0
func (d *DeleteBuilder) WhereBetweenColumns(column string, c1 string, c2 string) *DeleteBuilder
WhereBetweenColumns adds "col BETWEEN c1 AND c2" comparing against columns.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price"
func (*DeleteBuilder) WhereColumn ¶ added in v0.2.0
func (d *DeleteBuilder) WhereColumn(first string, args ...any) *DeleteBuilder
WhereColumn compares two columns: WhereColumn(a, b) means "=", or WhereColumn(a, op, b).
Example:
conn.Select().From("users").WhereColumn("updated_at", ">", "created_at")
// SELECT * FROM "users" WHERE "updated_at" > "created_at"
func (*DeleteBuilder) WhereDate ¶ added in v0.2.0
func (d *DeleteBuilder) WhereDate(column string, args ...any) *DeleteBuilder
WhereDate compares the date part of a column.
Example:
conn.Select().From("orders").WhereDate("created_at", ">=", "2024-01-15")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::DATE >= $1 args: [2024-01-15]
// MySQL: SELECT * FROM `orders` WHERE DATE(`created_at`) >= ? args: [2024-01-15]
// SQLite: SELECT * FROM "orders" WHERE STRFTIME('%Y-%m-%d', "created_at") >= CAST(? AS TEXT)
// args: [2024-01-15]
func (*DeleteBuilder) WhereDay ¶ added in v0.2.0
func (d *DeleteBuilder) WhereDay(column string, args ...any) *DeleteBuilder
WhereDay compares the day-of-month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereDay("created_at", 15)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 args: [15]
// MySQL: SELECT * FROM `orders` WHERE DAY(`created_at`) = ? args: [15]
func (*DeleteBuilder) WhereExists ¶ added in v0.2.0
func (d *DeleteBuilder) WhereExists(sub *SelectBuilder) *DeleteBuilder
WhereExists adds "EXISTS (subquery)". Build sub with DB.Select.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereExists(posts)
// SELECT * FROM "users" WHERE EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*DeleteBuilder) WhereGroup ¶ added in v0.2.0
func (d *DeleteBuilder) WhereGroup(fn func(*WhereClause)) *DeleteBuilder
WhereGroup wraps the predicates added inside fn in parentheses. fn receives a fresh WhereClause; only its Where* calls are used.
Example:
conn.Select().From("users").Where("active", true).WhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").OrWhere("role", "editor")
})
// SELECT * FROM "users" WHERE "active" = $1 AND ("role" = $2 OR "role" = $3)
// args: [true admin editor]
func (*DeleteBuilder) WhereIn ¶ added in v0.2.0
func (d *DeleteBuilder) WhereIn(column string, values any) *DeleteBuilder
WhereIn adds "col IN (...)". values may be any slice, a scalar, or a *SelectBuilder subquery. An empty list compiles to the always-false "0 = 1".
Example:
conn.Select().From("users").WhereIn("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN ($1, $2, $3) args: [1 2 3]
func (*DeleteBuilder) WhereIntegerInRaw ¶ added in v0.2.0
func (d *DeleteBuilder) WhereIntegerInRaw(column string, values any) *DeleteBuilder
WhereIntegerInRaw inlines integers (no bind args); non-integers record an error. Useful for very large ID lists that would exceed driver parameter limits.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN (1, 2, 3)
func (*DeleteBuilder) WhereIntegerNotInRaw ¶ added in v0.2.0
func (d *DeleteBuilder) WhereIntegerNotInRaw(column string, values any) *DeleteBuilder
WhereIntegerNotInRaw is the negated WhereIntegerInRaw.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2)
func (*DeleteBuilder) WhereJsonContains ¶ added in v0.2.0
func (d *DeleteBuilder) WhereJsonContains(column string, value any) *DeleteBuilder
WhereJsonContains adds a JSON containment test on a column or "col->path". MySQL json_contains, Postgres @> (jsonb), SQLite json_each membership.
Example:
conn.Select().From("users").WhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE ("options"->'tags')::JSONB @> $1 args: ["go"]
func (*DeleteBuilder) WhereJsonContainsKey ¶ added in v0.2.0
func (d *DeleteBuilder) WhereJsonContainsKey(column string) *DeleteBuilder
WhereJsonContainsKey tests that the JSON path "col->key" exists.
Example:
conn.Select().From("users").WhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
// MySQL: SELECT * FROM `users`
// WHERE IFNULL(JSON_CONTAINS_PATH(`options`, 'one', '$."theme"'), 0)
func (*DeleteBuilder) WhereJsonDoesntContain ¶ added in v0.2.0
func (d *DeleteBuilder) WhereJsonDoesntContain(column string, value any) *DeleteBuilder
WhereJsonDoesntContain negates WhereJsonContains.
Example:
conn.Select().From("users").WhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE NOT ("options"->'tags')::JSONB @> $1 args: ["php"]
func (*DeleteBuilder) WhereJsonDoesntContainKey ¶ added in v0.2.0
func (d *DeleteBuilder) WhereJsonDoesntContainKey(column string) *DeleteBuilder
WhereJsonDoesntContainKey negates WhereJsonContainsKey.
Example:
conn.Select().From("users").WhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE NOT COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
func (*DeleteBuilder) WhereJsonDoesntOverlap ¶ added in v0.2.0
func (d *DeleteBuilder) WhereJsonDoesntOverlap(column string, value any) *DeleteBuilder
WhereJsonDoesntOverlap negates WhereJsonOverlaps.
Example:
conn.Select().From("users")
.WhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["php"]]
func (*DeleteBuilder) WhereJsonLength ¶ added in v0.2.0
func (d *DeleteBuilder) WhereJsonLength(column string, args ...any) *DeleteBuilder
WhereJsonLength compares the length of a JSON array: (value) or (operator, value).
Example:
conn.Select().From("users")
.WhereJsonLength("options->tags", 2).WhereJsonLength("options->roles", ">", 1).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// AND JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) > $2 args: [2 1]
func (*DeleteBuilder) WhereJsonOverlaps ¶ added in v0.2.0
func (d *DeleteBuilder) WhereJsonOverlaps(column string, value any) *DeleteBuilder
WhereJsonOverlaps adds json_overlaps (MySQL only; other dialects error at compile time).
Example:
conn.Select().From("users")
.WhereJsonOverlaps("options->tags", []string{"go", "sql"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["go","sql"]]
func (*DeleteBuilder) WhereLike ¶ added in v0.2.0
func (d *DeleteBuilder) WhereLike(column string, value any, caseSensitive ...bool) *DeleteBuilder
WhereLike adds a LIKE predicate, case-insensitive unless caseSensitive[0] is true. Postgres: ILIKE/LIKE. MySQL: LIKE/LIKE BINARY. SQLite: LIKE/GLOB (pattern converted).
Example:
conn.Select().From("users").WhereLike("name", "An%")
// Postgres: SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 args: [An%]
// MySQL: SELECT * FROM `users` WHERE `name` LIKE ? args: [An%]
// SQLite: SELECT * FROM "users" WHERE "name" LIKE ? args: [An%]
func (*DeleteBuilder) WhereMap ¶ added in v0.2.0
func (d *DeleteBuilder) WhereMap(m map[string]any) *DeleteBuilder
WhereMap adds one grouped "a = ? and b = ?" predicate; keys are sorted for stable SQL.
Example:
conn.Select().From("users").WhereMap(map[string]any{"role": "ann", "active": true})
// SELECT * FROM "users" WHERE ("active" = $1 AND "role" = $2) args: [true ann]
func (*DeleteBuilder) WhereMonth ¶ added in v0.2.0
func (d *DeleteBuilder) WhereMonth(column string, args ...any) *DeleteBuilder
WhereMonth compares the month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereMonth("created_at", 3)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") = $1 args: [03]
// MySQL: SELECT * FROM `orders` WHERE MONTH(`created_at`) = ? args: [03]
func (*DeleteBuilder) WhereNone ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNone(columns []string, args ...any) *DeleteBuilder
WhereNone requires the predicate to hold for no column: not (a = ? or b = ?).
Example:
conn.Select().From("users").WhereNone([]string{"first_name", "last_name"}, "like", "%test%")
// SELECT * FROM "users" WHERE NOT ("first_name"::TEXT LIKE $1 OR "last_name"::TEXT LIKE $2)
// args: [%test% %test%]
func (*DeleteBuilder) WhereNot ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNot(column string, args ...any) *DeleteBuilder
WhereNot adds "AND NOT <predicate>".
Example:
conn.Select().From("users").WhereNot("role", "admin")
// SELECT * FROM "users" WHERE NOT "role" = $1 args: [admin]
func (*DeleteBuilder) WhereNotBetween ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNotBetween(column string, lo any, hi any) *DeleteBuilder
WhereNotBetween adds "col NOT BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 args: [10 100]
func (*DeleteBuilder) WhereNotBetweenColumns ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNotBetweenColumns(column string, c1 string, c2 string) *DeleteBuilder
WhereNotBetweenColumns is the negated WhereBetweenColumns.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price"
func (*DeleteBuilder) WhereNotExists ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNotExists(sub *SelectBuilder) *DeleteBuilder
WhereNotExists adds "NOT EXISTS (subquery)".
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereNotExists(posts)
// SELECT * FROM "users" WHERE NOT EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*DeleteBuilder) WhereNotIn ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNotIn(column string, values any) *DeleteBuilder
WhereNotIn adds "col NOT IN (...)". An empty list compiles to "1 = 1".
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) args: [1 2]
func (*DeleteBuilder) WhereNotLike ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNotLike(column string, value any, caseSensitive ...bool) *DeleteBuilder
WhereNotLike is the negated WhereLike.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%")
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 args: [%test%]
func (*DeleteBuilder) WhereNotNull ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNotNull(column string) *DeleteBuilder
WhereNotNull adds "col IS NOT NULL".
Example:
conn.Select().From("users").WhereNotNull("verified_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL
func (*DeleteBuilder) WhereNull ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNull(column string) *DeleteBuilder
WhereNull adds "col IS NULL".
Example:
conn.Select().From("users").WhereNull("deleted_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL
func (*DeleteBuilder) WhereNullSafeEquals ¶ added in v0.2.0
func (d *DeleteBuilder) WhereNullSafeEquals(column string, value any) *DeleteBuilder
WhereNullSafeEquals compares with NULL-safe equality (<=>, IS NOT DISTINCT FROM, IS).
Example:
conn.Select().From("users").WhereNullSafeEquals("manager_id", 7)
// Postgres: SELECT * FROM "users" WHERE "manager_id" IS NOT DISTINCT FROM $1 args: [7]
// MySQL: SELECT * FROM `users` WHERE `manager_id` <=> ? args: [7]
func (*DeleteBuilder) WhereRaw ¶ added in v0.2.0
func (d *DeleteBuilder) WhereRaw(sql string, args ...any) *DeleteBuilder
WhereRaw adds a raw predicate (caller-trusted SQL).
Example:
conn.Select().From("users").WhereRaw("lower(name) = ?", "ann")
// SELECT * FROM "users" WHERE lower(name) = $1
// args: [ann]
func (*DeleteBuilder) WhereRowValues ¶ added in v0.2.0
func (d *DeleteBuilder) WhereRowValues(columns []string, op string, values []any) *DeleteBuilder
WhereRowValues adds "(a, b) op (?, ?)".
Example:
conn.Select().From("events").
WhereRowValues([]string{"created_at", "id"}, ">", []any{"2024-01-15", 42})
// SELECT * FROM "events" WHERE ("created_at", "id") > ($1, $2) args: [2024-01-15 42]
func (*DeleteBuilder) WhereTime ¶ added in v0.2.0
func (d *DeleteBuilder) WhereTime(column string, args ...any) *DeleteBuilder
WhereTime compares the time part of a column.
Example:
conn.Select().From("orders").WhereTime("created_at", ">", "10:30:00")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::TIME > $1 args: [10:30:00]
// MySQL: SELECT * FROM `orders` WHERE TIME(`created_at`) > ? args: [10:30:00]
func (*DeleteBuilder) WhereValueBetween ¶ added in v0.2.0
func (d *DeleteBuilder) WhereValueBetween(value any, c1 string, c2 string) *DeleteBuilder
WhereValueBetween adds "? BETWEEN c1 AND c2" (a value between two columns).
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" args: [50]
func (*DeleteBuilder) WhereValueNotBetween ¶ added in v0.2.0
func (d *DeleteBuilder) WhereValueNotBetween(value any, c1 string, c2 string) *DeleteBuilder
WhereValueNotBetween is the negated WhereValueBetween.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" args: [50]
func (*DeleteBuilder) WhereYear ¶ added in v0.2.0
func (d *DeleteBuilder) WhereYear(column string, args ...any) *DeleteBuilder
WhereYear compares the year of a column.
Example:
conn.Select().From("orders").WhereYear("created_at", 2024)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") = $1
// args: [2024]
// MySQL: SELECT * FROM `orders` WHERE YEAR(`created_at`) = ? args: [2024]
func (*DeleteBuilder) With ¶ added in v0.2.0
func (d *DeleteBuilder) With(name string, q *SelectBuilder, opts ...CTEOption) *DeleteBuilder
With adds a common table expression: "with name as (q)". The name is a table reference, so the table prefix applies to it as it does to From. The subquery is snapshotted: later changes to q do not affect this query. Options name the columns (CTEColumns) or hint materialization (CTEMaterialized, CTENotMaterialized).
On a select, a CTE can feed the query, a subquery, a union member, Count, Exists and Paginate. On an update or delete it is written before the verb (PostgreSQL, MySQL 8, SQLite; MariaDB returns ErrUnsupported). On an insert it is moved into the SELECT given to Using, so it needs Using.
Example:
active := conn.Select().From("users").Where("active", true)
conn.Select().From("active_users").With("active_users", active)
// WITH "active_users" AS (SELECT * FROM "users" WHERE "active" = $1) SELECT * FROM
// "active_users"
// args: [true]
func (*DeleteBuilder) WithRaw ¶ added in v0.2.0
func (d *DeleteBuilder) WithRaw(name string, e Expression, opts ...CTEOption) *DeleteBuilder
WithRaw adds a common table expression whose body is a raw SQL fragment (caller-trusted SQL), e.g. db.Raw("values (?), (?)", 1, 2). It takes the same options as With.
Example:
conn.Select().From("ids").WithRaw("ids", db.Raw("values (?), (?)", 1, 2), db.CTEColumns("id"))
// WITH "ids" ("id") AS (values ($1), ($2)) SELECT * FROM "ids"
// args: [1 2]
func (*DeleteBuilder) WithRecursive ¶ added in v0.2.0
func (d *DeleteBuilder) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *DeleteBuilder
WithRecursive adds a recursive common table expression and switches the clause to "with recursive". anchor is the starting query and step the recursive member that refers to name; they are joined with UNION ALL (CTEUnionDistinct for UNION) and written without parentheses, because SQLite rejects a recursive reference inside a subquery. Neither query is modified, and anchor must not have unions.
Example:
anchor := conn.Select().From("categories").Where("parent_id", nil)
step := conn.Select().From("categories as c").Join("tree as t", "c.parent_id", "t.id")
conn.Select().From("tree").WithRecursive("tree", anchor, step)
// WITH RECURSIVE "tree" AS (SELECT * FROM "categories" WHERE "parent_id" IS NULL UNION ALL
// SELECT * FROM "categories" AS "c" INNER JOIN "tree" AS "t" ON "c"."parent_id" =
// "t"."id") SELECT * FROM "tree"
type Dialect ¶
type Dialect int
Dialect selects the SQL grammar used to compile queries.
const ( Postgres Dialect = iota + 1 MySQL SQLite // MariaDB shares MySQL's grammar and differs in two places: it has no lateral // joins, and it has no CAST AS JSON (json_query is used for JSON container values). MariaDB )
The supported dialects. The zero Dialect is invalid and returns ErrUnknownDialect.
type Expression ¶
Expression is a raw SQL fragment inlined verbatim into the query. Use "?" for bind markers (write "??" for a literal "?"). The SQL text is NOT escaped: only pass caller-trusted strings, never user input.
func Raw ¶
func Raw(sql string, args ...any) Expression
Raw builds an Expression.
Example:
conn.Select().From("users").Where("created_at", ">", db.Raw("now() - interval '1 day'"))
// SELECT * FROM "users" WHERE "created_at" > now() - interval '1 day'
type HavingClause ¶ added in v0.2.0
type HavingClause struct {
// contains filtered or unexported fields
}
HavingClause collects the predicates of a parenthesized HAVING group; it only offers the having methods. It is passed to HavingGroup/OrHavingGroup callbacks.
func (*HavingClause) Having ¶ added in v0.2.0
func (h *HavingClause) Having(column string, args ...any) *HavingClause
Having adds an AND HAVING predicate; same argument forms as Where.
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
Having("user_id", ">", 10)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING "user_id" > $1
// args: [10]
func (*HavingClause) HavingBetween ¶ added in v0.2.0
func (h *HavingClause) HavingBetween(column string, lo any, hi any) *HavingClause
HavingBetween adds "col BETWEEN lo AND hi" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingBetween("spent", 100, 500)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent"
// BETWEEN $1 AND $2
// args: [100 500]
func (*HavingClause) HavingGroup ¶ added in v0.2.0
func (h *HavingClause) HavingGroup(fn func(*HavingClause)) *HavingClause
HavingGroup wraps the Having* predicates added inside fn in parentheses.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
SelectRaw("count(*) as n").HavingGroup(func(q *db.HavingClause) {
q.Having("spent", ">", 100).OrHaving("n", ">", 5)
})
// SELECT "user_id", sum(total) as spent, count(*) as n FROM "orders" GROUP BY "user_id"
// HAVING ("spent" > $1 OR "n" > $2)
// args: [100 5]
func (*HavingClause) HavingNotBetween ¶ added in v0.2.0
func (h *HavingClause) HavingNotBetween(column string, lo any, hi any) *HavingClause
HavingNotBetween adds "col NOT BETWEEN lo AND hi" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotBetween("spent", 100, 500)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" NOT
// BETWEEN $1 AND $2
// args: [100 500]
func (*HavingClause) HavingNotNull ¶ added in v0.2.0
func (h *HavingClause) HavingNotNull(column string) *HavingClause
HavingNotNull adds "col IS NOT NULL" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotNull("spent")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NOT NULL
func (*HavingClause) HavingNull ¶ added in v0.2.0
func (h *HavingClause) HavingNull(column string) *HavingClause
HavingNull adds "col IS NULL" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNull("spent")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NULL
func (*HavingClause) HavingRaw ¶ added in v0.2.0
func (h *HavingClause) HavingRaw(sql string, args ...any) *HavingClause
HavingRaw adds a raw HAVING predicate (caller-trusted SQL).
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
HavingRaw("sum(amount) > ?", 100)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING sum(amount) > $1
// args: [100]
func (*HavingClause) OrHaving ¶ added in v0.2.0
func (h *HavingClause) OrHaving(column string, args ...any) *HavingClause
OrHaving is Having joined with OR.
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
Having("user_id", ">", 10).OrHaving("user_id", 1)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING "user_id" > $1 OR "user_id" = $2
// args: [10 1]
func (*HavingClause) OrHavingBetween ¶ added in v0.2.0
func (h *HavingClause) OrHavingBetween(column string, lo any, hi any) *HavingClause
OrHavingBetween is HavingBetween joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingBetween("spent", 100, 500).OrHavingBetween("user_id", 1, 3)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent"
// BETWEEN $1 AND $2 OR "user_id" BETWEEN $3 AND $4
// args: [100 500 1 3]
func (*HavingClause) OrHavingGroup ¶ added in v0.2.0
func (h *HavingClause) OrHavingGroup(fn func(*HavingClause)) *HavingClause
OrHavingGroup is HavingGroup joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
SelectRaw("count(*) as n").Having("n", ">", 1).OrHavingGroup(func(q *db.HavingClause) {
q.Having("spent", ">", 100).Having("n", "<", 3)
})
// SELECT "user_id", sum(total) as spent, count(*) as n FROM "orders" GROUP BY "user_id"
// HAVING "n" > $1 OR ("spent" > $2 AND "n" < $3)
// args: [1 100 3]
func (*HavingClause) OrHavingNotBetween ¶ added in v0.2.0
func (h *HavingClause) OrHavingNotBetween(column string, lo any, hi any) *HavingClause
OrHavingNotBetween is HavingNotBetween joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotBetween("spent", 100, 500).OrHavingNotBetween("user_id", 1, 3)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" NOT
// BETWEEN $1 AND $2 OR "user_id" NOT BETWEEN $3 AND $4
// args: [100 500 1 3]
func (*HavingClause) OrHavingNotNull ¶ added in v0.2.0
func (h *HavingClause) OrHavingNotNull(column string) *HavingClause
OrHavingNotNull is HavingNotNull joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotNull("spent").OrHavingNotNull("user_id")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NOT NULL OR "user_id" IS NOT NULL
func (*HavingClause) OrHavingNull ¶ added in v0.2.0
func (h *HavingClause) OrHavingNull(column string) *HavingClause
OrHavingNull is HavingNull joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNull("spent").OrHavingNull("user_id")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NULL OR "user_id" IS NULL
func (*HavingClause) OrHavingRaw ¶ added in v0.2.0
func (h *HavingClause) OrHavingRaw(sql string, args ...any) *HavingClause
OrHavingRaw is HavingRaw joined with OR.
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
HavingRaw("sum(amount) > ?", 100).OrHavingRaw("count(*) > ?", 5)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING sum(amount) > $1 OR count(*) > $2
// args: [100 5]
type InsertBuilder ¶ added in v0.2.0
type InsertBuilder struct {
// contains filtered or unexported fields
}
InsertBuilder is a mutable INSERT statement. Start one with DB.Insert; add rows with Values or Rows (or Using for INSERT ... SELECT) and finish with Exec, Get or ToSQL. Not safe for concurrent use.
func (*InsertBuilder) Clone ¶ added in v0.2.0
func (i *InsertBuilder) Clone() *InsertBuilder
Clone returns an independent copy. Cloning a nil *InsertBuilder returns nil.
Example:
base := conn.Insert("users").Values(map[string]any{"name": "Ann"})
withID := base.Clone().Returning("id")
func (*InsertBuilder) Err ¶ added in v0.2.0
func (i *InsertBuilder) Err() error
Err returns the first error recorded while building.
Example:
q := conn.Select().From("users").Where("id", "!!", 1)
err := q.Err()
// err: quill: invalid operator: "!!"
func (*InsertBuilder) Exec ¶ added in v0.2.0
func (i *InsertBuilder) Exec(ctx context.Context) (int64, error)
Exec runs the insert and returns the rows affected. No rows is a no-op.
Example:
n, err := conn.Insert("users").Values(map[string]any{"name": "Ann"}).Exec(ctx)
// INSERT INTO "users" ("name") VALUES ($1) args: [Ann] (n = 1)
func (*InsertBuilder) ExecGetID ¶ added in v0.2.0
ExecGetID runs a single-row insert and returns the generated key (see IDSQL).
Example:
id, err := conn.Insert("users").Values(map[string]any{"name": "Ann"}).ExecGetID(ctx)
// Postgres: INSERT INTO "users" ("name") VALUES ($1) RETURNING "id" (id = 12)
func (*InsertBuilder) Get ¶ added in v0.2.0
func (i *InsertBuilder) Get(ctx context.Context, dest any) error
Get runs the insert and scans the RETURNING rows into dest (a pointer to a slice of structs, maps or scalars). Call Returning first. Postgres and SQLite >= 3.35.
Example:
var created []User
err := conn.Insert("users").Values(map[string]any{"name": "Ann"}).Returning("*").Get(ctx, &created)
// INSERT INTO "users" ("name") VALUES ($1) RETURNING * args: [Ann]
func (*InsertBuilder) IDSQL ¶ added in v0.2.0
func (i *InsertBuilder) IDSQL(sequence ...string) (string, []any, error)
IDSQL compiles a single-row insert that returns the generated key: RETURNING on Postgres (sequence names the column, default "id"), a plain insert elsewhere.
Example:
conn.Insert("users").Values(map[string]any{"name": "Ann"}).IDSQL()
// Postgres: INSERT INTO "users" ("name") VALUES ($1) RETURNING "id" args: [Ann]
func (*InsertBuilder) Ignore ¶ added in v0.2.0
func (i *InsertBuilder) Ignore() *InsertBuilder
Ignore skips rows that conflict instead of failing: INSERT IGNORE on MySQL, ON CONFLICT DO NOTHING on Postgres and SQLite.
Example:
conn.Insert("users").Values(map[string]any{"email": "a@x.io"}).Ignore()
// INSERT INTO "users" ("email") VALUES ($1) ON CONFLICT DO NOTHING
func (*InsertBuilder) Prefix ¶ added in v0.2.0
func (i *InsertBuilder) Prefix(p string) *InsertBuilder
Prefix sets a table prefix applied to table names, aliases and qualified columns.
Example:
db.Use(db.Postgres).Select("u.id").From("users as u").Prefix("app_")
// SELECT "app_u"."id" FROM "app_users" AS "app_u"
func (*InsertBuilder) Returning ¶ added in v0.2.0
func (i *InsertBuilder) Returning(columns ...string) *InsertBuilder
Returning adds a RETURNING clause to insert/update/delete/upsert (Postgres, SQLite >= 3.35; MySQL returns ErrUnsupported). "*" is allowed.
Example:
conn.Insert("users").Values(map[string]any{"name": "Ann"}).Returning("id", "created_at").ToSQL()
// INSERT INTO "users" ("name") VALUES ($1) RETURNING "id", "created_at" args: [Ann]
// MySQL: ToSQL returns ErrUnsupported
func (*InsertBuilder) Rows ¶ added in v0.2.0
func (i *InsertBuilder) Rows(structs ...any) *InsertBuilder
Rows appends structs (or slices of structs) as rows, using the same `db` tags as Row. An `omitempty` column is left out only when it is zero in every row of one Rows call, since a batch insert cannot skip a column for just some rows.
Example:
conn.Insert("posts").Rows(Post{Title: "One"}, Post{Title: "Two"})
// INSERT INTO "posts" ("title") VALUES ($1), ($2) args: [One Two]
func (*InsertBuilder) ToSQL ¶ added in v0.2.0
func (i *InsertBuilder) ToSQL() (string, []any, error)
ToSQL compiles the INSERT into SQL text and its ordered bind arguments. No rows returns ErrNoValues.
Example:
sqlText, args, err := conn.Insert("users").Values(map[string]any{"name": "Ann"}).ToSQL()
// INSERT INTO "users" ("name") VALUES ($1) args: [Ann]
func (*InsertBuilder) Upsert ¶ added in v0.2.0
func (i *InsertBuilder) Upsert(uniqueBy, update []string) *InsertBuilder
Upsert updates on conflict. update lists the columns that take the inserted value (nil means every inserted column). uniqueBy is required on Postgres/SQLite (the conflict target) and ignored on MySQL.
Example:
conn.Insert("users").Values(map[string]any{"email": "a@x.io", "name": "Ann"}).
Upsert([]string{"email"}, []string{"name"})
// MySQL: INSERT INTO `users` (`email`, `name`) VALUES (?, ?)
// ON DUPLICATE KEY UPDATE `name` = VALUES(`name`) args: [a@x.io Ann]
func (*InsertBuilder) Using ¶ added in v0.2.0
func (i *InsertBuilder) Using(columns []string, sub *SelectBuilder) *InsertBuilder
Using inserts the rows of a SELECT into columns (INSERT ... SELECT).
Example:
conn.Insert("archived_users").Using([]string{"name"}, conn.Select("name").From("users"))
// INSERT INTO "archived_users" ("name") SELECT "name" FROM "users" args: []
func (*InsertBuilder) Values ¶ added in v0.2.0
func (i *InsertBuilder) Values(rows ...map[string]any) *InsertBuilder
Values appends rows, each a column map. Every row must use the same columns.
Example:
conn.Insert("users").Values(map[string]any{"name": "Ann"}, map[string]any{"name": "Bob"})
// INSERT INTO "users" ("name") VALUES ($1), ($2) args: [Ann Bob]
func (*InsertBuilder) With ¶ added in v0.2.0
func (i *InsertBuilder) With(name string, q *SelectBuilder, opts ...CTEOption) *InsertBuilder
With adds a common table expression: "with name as (q)". The name is a table reference, so the table prefix applies to it as it does to From. The subquery is snapshotted: later changes to q do not affect this query. Options name the columns (CTEColumns) or hint materialization (CTEMaterialized, CTENotMaterialized).
On a select, a CTE can feed the query, a subquery, a union member, Count, Exists and Paginate. On an update or delete it is written before the verb (PostgreSQL, MySQL 8, SQLite; MariaDB returns ErrUnsupported). On an insert it is moved into the SELECT given to Using, so it needs Using.
Example:
active := conn.Select().From("users").Where("active", true)
conn.Select().From("active_users").With("active_users", active)
// WITH "active_users" AS (SELECT * FROM "users" WHERE "active" = $1) SELECT * FROM
// "active_users"
// args: [true]
func (*InsertBuilder) WithRaw ¶ added in v0.2.0
func (i *InsertBuilder) WithRaw(name string, e Expression, opts ...CTEOption) *InsertBuilder
WithRaw adds a common table expression whose body is a raw SQL fragment (caller-trusted SQL), e.g. db.Raw("values (?), (?)", 1, 2). It takes the same options as With.
Example:
conn.Select().From("ids").WithRaw("ids", db.Raw("values (?), (?)", 1, 2), db.CTEColumns("id"))
// WITH "ids" ("id") AS (values ($1), ($2)) SELECT * FROM "ids"
// args: [1 2]
func (*InsertBuilder) WithRecursive ¶ added in v0.2.0
func (i *InsertBuilder) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *InsertBuilder
WithRecursive adds a recursive common table expression and switches the clause to "with recursive". anchor is the starting query and step the recursive member that refers to name; they are joined with UNION ALL (CTEUnionDistinct for UNION) and written without parentheses, because SQLite rejects a recursive reference inside a subquery. Neither query is modified, and anchor must not have unions.
Example:
anchor := conn.Select().From("categories").Where("parent_id", nil)
step := conn.Select().From("categories as c").Join("tree as t", "c.parent_id", "t.id")
conn.Select().From("tree").WithRecursive("tree", anchor, step)
// WITH RECURSIVE "tree" AS (SELECT * FROM "categories" WHERE "parent_id" IS NULL UNION ALL
// SELECT * FROM "categories" AS "c" INNER JOIN "tree" AS "t" ON "c"."parent_id" =
// "t"."id") SELECT * FROM "tree"
type JoinClause ¶
type JoinClause struct {
// contains filtered or unexported fields
}
JoinClause builds the ON conditions of one join. Column-to-column comparisons use On/OrOn; value comparisons use Where/OrWhere.
func (*JoinClause) On ¶
func (j *JoinClause) On(first string, args ...any) *JoinClause
On adds "first = second" or "first op second" (column to column).
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").On("p.created_at", ">=", "u.created_at")
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."created_at" >= "u"."created_at"
func (*JoinClause) OnGroup ¶
func (j *JoinClause) OnGroup(fn func(*JoinClause)) *JoinClause
OnGroup wraps the conditions added inside fn in parentheses.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").OnGroup(func(g *db.JoinClause) {
g.Where("p.status", "published").OrWhere("p.status", "draft")
})
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// ("p"."status" = $1 OR "p"."status" = $2)
// args: [published draft]
func (*JoinClause) OrOn ¶
func (j *JoinClause) OrOn(first string, args ...any) *JoinClause
OrOn is On joined with OR.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").OrOn("p.editor_id", "u.id")
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" OR
// "p"."editor_id" = "u"."id"
func (*JoinClause) OrOnGroup ¶
func (j *JoinClause) OrOnGroup(fn func(*JoinClause)) *JoinClause
OrOnGroup is OnGroup joined with OR.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").OrOnGroup(func(g *db.JoinClause) {
g.On("p.editor_id", "u.id").Where("p.score", ">", 10)
})
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" OR
// ("p"."editor_id" = "u"."id" AND "p"."score" > $1)
// args: [10]
func (*JoinClause) OrWhere ¶
func (j *JoinClause) OrWhere(column string, args ...any) *JoinClause
OrWhere is Where joined with OR.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.status", "published").OrWhere("p.pinned", true)
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."status" = $1 OR "p"."pinned" = $2
// args: [published true]
func (*JoinClause) OrWhereIn ¶
func (j *JoinClause) OrWhereIn(column string, values any) *JoinClause
OrWhereIn is WhereIn joined with OR.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").OrWhereIn("p.status", []string{"draft"})
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" OR
// "p"."status" IN ($1)
// args: [draft]
func (*JoinClause) OrWhereNotIn ¶
func (j *JoinClause) OrWhereNotIn(column string, values any) *JoinClause
OrWhereNotIn is WhereNotIn joined with OR.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").OrWhereNotIn("p.status", []string{"spam"})
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" OR
// "p"."status" NOT IN ($1)
// args: [spam]
func (*JoinClause) OrWhereNotNull ¶
func (j *JoinClause) OrWhereNotNull(column string) *JoinClause
OrWhereNotNull is WhereNotNull joined with OR.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").OrWhereNotNull("p.published_at")
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" OR
// "p"."published_at" IS NOT NULL
func (*JoinClause) OrWhereNull ¶
func (j *JoinClause) OrWhereNull(column string) *JoinClause
OrWhereNull is WhereNull joined with OR.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").OrWhereNull("p.deleted_at")
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" OR
// "p"."deleted_at" IS NULL
func (*JoinClause) OrWhereRaw ¶
func (j *JoinClause) OrWhereRaw(sql string, args ...any) *JoinClause
OrWhereRaw is WhereRaw joined with OR.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").OrWhereRaw("p.score > ?", 10)
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" OR
// p.score > $1
// args: [10]
func (*JoinClause) Where ¶
func (j *JoinClause) Where(column string, args ...any) *JoinClause
Where adds a bound-value condition: Where(col, value) or Where(col, op, value).
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.status", "published").Where("p.score", ">", 10)
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."status" = $1 AND "p"."score" > $2
// args: [published 10]
func (*JoinClause) WhereIn ¶
func (j *JoinClause) WhereIn(column string, values any) *JoinClause
WhereIn adds "col IN (...)".
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereIn("p.status", []string{"published", "draft"})
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."status" IN ($1, $2)
// args: [published draft]
func (*JoinClause) WhereNotIn ¶
func (j *JoinClause) WhereNotIn(column string, values any) *JoinClause
WhereNotIn adds "col NOT IN (...)".
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNotIn("p.status", []string{"spam"})
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."status" NOT IN ($1)
// args: [spam]
func (*JoinClause) WhereNotNull ¶
func (j *JoinClause) WhereNotNull(column string) *JoinClause
WhereNotNull adds "col IS NOT NULL".
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNotNull("p.published_at")
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."published_at" IS NOT NULL
func (*JoinClause) WhereNull ¶
func (j *JoinClause) WhereNull(column string) *JoinClause
WhereNull adds "col IS NULL".
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNull("p.deleted_at")
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."deleted_at" IS NULL
func (*JoinClause) WhereRaw ¶
func (j *JoinClause) WhereRaw(sql string, args ...any) *JoinClause
WhereRaw adds a raw condition (caller-trusted SQL).
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereRaw("p.score > ?", 10)
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// p.score > $1
// args: [10]
type Option ¶
type Option func(*DB)
Option configures a DB.
Example:
conn := db.New(sqlDB, db.Postgres, db.WithPrefix("app_"), db.WithLogArgs())
func WithHook ¶
func WithHook(fn func(context.Context, QueryEvent)) Option
WithHook registers fn to run after every statement (logging, metrics, tracing). Bind values are omitted from the event unless WithLogArgs is also set.
Example:
hook := func(_ context.Context, ev db.QueryEvent) { log.Println(ev.SQL, ev.NumArgs) }
conn := db.New(sqlDB, db.Postgres, db.WithHook(hook))
conn.Select().From("users").Where("name", "ann").Count(ctx)
// hook sees: SELECT COUNT(*) AS "aggregate" FROM "users" WHERE "name" = $1, 1
func WithLogArgs ¶
func WithLogArgs() Option
WithLogArgs includes bind values in QueryEvent.Args. Off by default because arguments routinely carry personal data (UU PDP / ISO 27701).
Example:
hook := func(_ context.Context, ev db.QueryEvent) { log.Println(ev.Args) }
conn := db.New(sqlDB, db.Postgres, db.WithHook(hook), db.WithLogArgs())
// ev.Args = ["ann"] for Where("name", "ann")
func WithPrefix ¶
WithPrefix sets a table prefix applied to every statement builder created from the DB.
Example:
conn := db.New(sqlDB, db.Postgres, db.WithPrefix("app_"))
conn.Select().From("users")
// SELECT * FROM "app_users"
type Page ¶
type Page struct {
Total int64
PerPage int
CurrentPage int
LastPage int
From int // 1-based index of the first row on the page; 0 when empty
To int
}
Page describes one page of a length-aware pagination.
Example:
var users []User
p, err := conn.Select().From("users").OrderBy("id").Paginate(ctx, 2, 2, &users)
// with 5 matching rows: p.Total = 5, p.PerPage = 2, p.CurrentPage = 2
// p.LastPage = 3, p.From = 3, p.To = 4
// with no rows: p.LastPage = 1, p.From = 0, p.To = 0 and users is empty
type Query ¶
type Query[T any] struct { // contains filtered or unexported fields }
Query reads rows of type T from a SelectBuilder. Go methods cannot take type parameters, so SelectBuilder cannot return []T itself; wrap the finished builder once instead:
users, err := db.As[User](conn.Select().From("users").Where("active", true)).Get(ctx)
T may be a struct (`db:"col"` tags, else snake_case field names), a map[string]any, or a scalar when the query selects a single column.
func As ¶
func As[T any](b *SelectBuilder) *Query[T]
As wraps b for typed reads. The builder is not copied: keep chaining on it before calling As, or use Builder to get it back.
Example:
q := db.As[string](conn.Select().From("users").Select("name"))
names, err := q.Get(ctx)
// SELECT "name" FROM "users" args: []
// names: [ann bob]
func From ¶
From starts a typed query on T's table: db.From[User](conn).Where(...).Get(ctx). A problem with T (no TableName method) is reported by the first terminal call, like any other builder error, so the chain stays unbroken.
Example:
q := db.From[Order](conn) // same as db.As[Order](conn.Select().From("orders"))
func (*Query[T]) AddSelect ¶
AddSelect appends columns.
Example:
conn.Select().From("users").Select("id").AddSelect("name", "age")
// SELECT "id", "name", "age" FROM "users"
func (*Query[T]) Apply ¶
func (q *Query[T]) Apply(fn func(*SelectBuilder)) *Query[T]
Apply runs fn on the underlying builder, for any SelectBuilder method this type does not mirror.
Example:
db.From[User](conn).Apply(func(b *db.SelectBuilder) { b.WhereDate("created_at", day) })
// SELECT * FROM "users" WHERE "created_at"::DATE = $1 args: [2026-01-02]
func (*Query[T]) Avg ¶
Avg returns avg(column) as float64 (0 when there are no rows).
Example:
avg, err := db.From[User](conn).Avg(ctx, "age")
// SELECT AVG("age") AS "aggregate" FROM "users" args: []
// avg: 28.7
func (*Query[T]) Builder ¶
func (q *Query[T]) Builder() *SelectBuilder
Builder returns the underlying builder for further chaining.
Example:
sql, args, err := db.From[User](conn).Where("age", ">", 18).Builder().OrderBy("name").ToSQL()
// SELECT * FROM "users" WHERE "age" > $1 ORDER BY "name" ASC args: [18]
func (*Query[T]) Chunk ¶
Chunk reads size rows at a time and calls fn; return false to stop. The query needs an ORDER BY. See SelectBuilder.Chunk.
Example:
err := db.From[User](conn).OrderBy("id").Chunk(ctx, 2, func(batch []User) (bool, error) {
// batch of 2, then batch of 1; return false to stop
return true, nil
})
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 2 OFFSET 0 args: []
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 2 OFFSET 2 args: []
func (*Query[T]) ChunkByID ¶
func (q *Query[T]) ChunkByID(ctx context.Context, size int, fn func([]T) (bool, error), column ...string) error
ChunkByID is Chunk with keyset paging on a unique column (default "id").
Example:
err := db.From[User](conn).ChunkByID(ctx, 2, func(batch []User) (bool, error) {
// batch of 2 (last id 2), then batch of 1 (last id 3)
return true, nil
})
// SELECT * FROM "users" WHERE "id" IS NOT NULL ORDER BY "id" ASC LIMIT 2 args: []
// SELECT * FROM "users" WHERE "id" > $1 ORDER BY "id" ASC LIMIT 2 args: [2]
func (*Query[T]) Clone ¶
Clone returns an independent copy of the query.
Example:
base := db.From[User](conn).Where("age", ">=", 18)
refined := base.Clone().OrderBy("name")
// refined: SELECT * FROM "users" WHERE "age" >= $1 ORDER BY "name" ASC args: [18]
// base is unchanged: SELECT * FROM "users" WHERE "age" >= $1 args: [18]
func (*Query[T]) Count ¶
Count returns the number of matching rows.
Example:
n, err := db.From[User](conn).Where("age", ">", 18).Count(ctx)
// SELECT COUNT(*) AS "aggregate" FROM "users" WHERE "age" > $1 args: [18]
// n: 3
func (*Query[T]) CrossJoin ¶ added in v0.2.0
CrossJoin adds "CROSS JOIN table".
Example:
conn.Select().From("users").CrossJoin("roles")
// SELECT * FROM "users" CROSS JOIN "roles"
func (*Query[T]) CrossJoinSub ¶ added in v0.2.0
func (q *Query[T]) CrossJoinSub(sub *SelectBuilder, as string) *Query[T]
CrossJoinSub cross joins a subquery.
Example:
sub := conn.Select().From("roles").Select("name").Where("active", true)
conn.Select().From("users").CrossJoinSub(sub, "r")
// SELECT * FROM "users" CROSS JOIN (SELECT "name" FROM "roles" WHERE "active" = $1) AS "r"
// args: [true]
func (*Query[T]) CursorPaginate ¶
func (q *Query[T]) CursorPaginate( ctx context.Context, perPage int, cursor string, opt ...CursorOptions, ) (CursorPaged[T], error)
CursorPaginate pages forward by keyset; see SelectBuilder.CursorPaginate.
Example:
p, err := db.From[User](conn).CursorPaginate(ctx, 2, "") // SELECT * FROM "users" ORDER BY "id" ASC LIMIT 3 args: [] // len(p.Items): 2, p.HasMore: true; pass p.NextCursor to fetch the next page
func (*Query[T]) Distinct ¶
Distinct marks the query SELECT DISTINCT.
Example:
conn.Select().From("posts").Distinct().Select("user_id")
// SELECT DISTINCT "user_id" FROM "posts"
func (*Query[T]) DoesntExist ¶
DoesntExist reports whether no row matches.
Example:
none, err := db.From[User](conn).Where("name", "ann").DoesntExist(ctx)
// SELECT EXISTS(SELECT * FROM "users" WHERE "name" = $1) AS "exists" args: [ann]
// none: false when a matching row exists
func (*Query[T]) Each ¶
Each streams rows to fn one at a time, holding a single row in memory.
Example:
err := db.From[User](conn).Each(ctx, func(u User) error {
fmt.Println(u.ID, u.Name) // 1 ann, then 2 bob
return nil
})
// SELECT * FROM "users" args: []
func (*Query[T]) Exists ¶
Exists reports whether any row matches.
Example:
ok, err := db.From[User](conn).Where("name", "ann").Exists(ctx)
// SELECT EXISTS(SELECT * FROM "users" WHERE "name" = $1) AS "exists" args: [ann]
// ok: true
func (*Query[T]) Find ¶
Find returns the row whose "id" equals id, or ErrNotFound.
Example:
u, err := db.From[User](conn).Find(ctx, 2) // SELECT * FROM "users" WHERE "id" = $1 LIMIT 1 args: [2] // u.Name: bob
func (*Query[T]) First ¶
First returns the first row, or ErrNotFound.
Example:
u, err := db.From[User](conn).Where("name", "ann").First(ctx)
// SELECT * FROM "users" WHERE "name" = $1 LIMIT 1 args: [ann]
// u.Name: ann; no row: errors.Is(err, db.ErrNotFound)
func (*Query[T]) ForPage ¶
ForPage sets offset/limit for a 1-based page.
Example:
conn.Select().From("users").OrderBy("id").ForPage(3, 25) // page 3, 25 rows per page
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 25 OFFSET 50
func (*Query[T]) ForPageAfterID ¶ added in v0.2.0
ForPageAfterID pages forwards by keyset: "id > lastID ORDER BY id ASC LIMIT n".
Example:
conn.Select().From("posts").ForPageAfterID(10, 42)
// SELECT * FROM "posts" WHERE "id" > $1 ORDER BY "id" ASC LIMIT 10 args: [42]
func (*Query[T]) ForPageBeforeID ¶ added in v0.2.0
ForPageBeforeID pages backwards by keyset: "id < lastID ORDER BY id DESC LIMIT n". A nil lastID selects "id IS NOT NULL". column defaults to "id".
Example:
conn.Select().From("posts").ForPageBeforeID(10, 42)
// SELECT * FROM "posts" WHERE "id" < $1 ORDER BY "id" DESC LIMIT 10 args: [42]
func (*Query[T]) ForceIndex ¶ added in v0.2.0
ForceIndex adds "FORCE INDEX (a)" (MySQL) or "INDEXED BY a" (SQLite, one name).
Example:
conn.Select().From("users").ForceIndex("idx_email").Where("active", true)
// MySQL: SELECT * FROM `users` FORCE INDEX (idx_email) WHERE `active` = ? args: [true]
// SQLite: SELECT * FROM "users" INDEXED BY idx_email WHERE "active" = ? args: [true]
func (*Query[T]) From ¶ added in v0.2.0
From sets the table ("users", "users as u", "schema.users").
Example:
db.Use(db.Postgres).Select().From("public.users as u")
// SELECT * FROM "public"."users" AS "u"
func (*Query[T]) FromRaw ¶ added in v0.2.0
FromRaw uses a raw SQL fragment as the source (caller-trusted SQL).
Example:
conn.Select().FromRaw("generate_series(?, ?) as g", 1, 3)
// SELECT * FROM generate_series($1, $2) as g args: [1 3]
func (*Query[T]) FromSub ¶ added in v0.2.0
func (q *Query[T]) FromSub(sub *SelectBuilder, as string) *Query[T]
FromSub uses "(subquery) as alias" as the source.
Example:
top := conn.Select().From("orders").SelectRaw("user_id, sum(total) as spent").GroupBy("user_id")
conn.Select().FromSub(top, "t").Where("spent", ">", 100)
// SELECT * FROM (SELECT user_id, sum(total) as spent FROM "orders" GROUP BY "user_id") AS
// "t" WHERE "spent" > $1
// args: [100]
func (*Query[T]) Get ¶
Get returns every matching row.
Example (User has TableName() returning "users"; conn is a *db.DB):
users, err := db.From[User](conn).OrderBy("id").Get(ctx)
// SELECT * FROM "users" ORDER BY "id" ASC args: []
// users: [{1 ann 30} {2 bob 25}]
func (*Query[T]) GroupBy ¶
GroupBy adds GROUP BY columns.
Example:
conn.Select().From("orders").Select("user_id", "status").GroupBy("user_id", "status")
// SELECT "user_id", "status" FROM "orders" GROUP BY "user_id", "status"
func (*Query[T]) GroupByRaw ¶ added in v0.2.0
GroupByRaw adds a raw GROUP BY expression.
Example:
conn.Select().From("orders").SelectRaw("date_trunc('day', created_at) as day").
GroupByRaw("date_trunc('day', created_at)")
// SELECT date_trunc('day', created_at) as day FROM "orders" GROUP BY date_trunc('day',
// created_at)
func (*Query[T]) Having ¶
Having adds an AND HAVING predicate; same argument forms as Where.
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
Having("user_id", ">", 10)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING "user_id" > $1
// args: [10]
func (*Query[T]) HavingBetween ¶ added in v0.2.0
HavingBetween adds "col BETWEEN lo AND hi" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingBetween("spent", 100, 500)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent"
// BETWEEN $1 AND $2
// args: [100 500]
func (*Query[T]) HavingGroup ¶ added in v0.2.0
func (q *Query[T]) HavingGroup(fn func(*HavingClause)) *Query[T]
HavingGroup wraps the Having* predicates added inside fn in parentheses.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
SelectRaw("count(*) as n").HavingGroup(func(q *db.HavingClause) {
q.Having("spent", ">", 100).OrHaving("n", ">", 5)
})
// SELECT "user_id", sum(total) as spent, count(*) as n FROM "orders" GROUP BY "user_id"
// HAVING ("spent" > $1 OR "n" > $2)
// args: [100 5]
func (*Query[T]) HavingNotBetween ¶ added in v0.2.0
HavingNotBetween adds "col NOT BETWEEN lo AND hi" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotBetween("spent", 100, 500)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" NOT
// BETWEEN $1 AND $2
// args: [100 500]
func (*Query[T]) HavingNotNull ¶ added in v0.2.0
HavingNotNull adds "col IS NOT NULL" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotNull("spent")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NOT NULL
func (*Query[T]) HavingNull ¶ added in v0.2.0
HavingNull adds "col IS NULL" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNull("spent")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NULL
func (*Query[T]) HavingRaw ¶
HavingRaw adds a raw HAVING predicate (caller-trusted SQL).
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
HavingRaw("sum(amount) > ?", 100)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING sum(amount) > $1
// args: [100]
func (*Query[T]) IgnoreIndex ¶ added in v0.2.0
IgnoreIndex adds "IGNORE INDEX (a)" (MySQL; ignored elsewhere).
Example:
conn.Select().From("users").IgnoreIndex("idx_email").Where("active", true)
// SELECT * FROM `users` IGNORE INDEX (idx_email) WHERE `active` = ? args: [true]
func (*Query[T]) InRandomOrder ¶ added in v0.2.0
InRandomOrder orders randomly: RANDOM() on Postgres/SQLite, RAND([seed]) on MySQL.
Example:
conn.Select().From("posts").InRandomOrder().Limit(5)
// Postgres: SELECT * FROM "posts" ORDER BY RANDOM() LIMIT 5
// MySQL: SELECT * FROM `posts` ORDER BY RAND() LIMIT 5
func (*Query[T]) Join ¶
Join adds "INNER JOIN table ON first = second" (or "first op second").
Example:
conn.Select().From("users as u").Join("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*Query[T]) JoinFunc ¶
func (q *Query[T]) JoinFunc(table string, fn func(*JoinClause)) *Query[T]
JoinFunc adds an inner join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.published", true)
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."published" = $1
// args: [true]
func (*Query[T]) JoinLateral ¶ added in v0.2.0
func (q *Query[T]) JoinLateral(sub *SelectBuilder, as string) *Query[T]
JoinLateral adds "INNER JOIN LATERAL (subquery) AS alias ON TRUE" (Postgres, MySQL >= 8.0.14).
Example:
recent := conn.Select().From("posts").Select("id", "title").
WhereColumn("posts.user_id", "u.id").Limit(1)
conn.Select().From("users as u").JoinLateral(recent, "rp")
// SELECT * FROM "users" AS "u" INNER JOIN LATERAL (SELECT "id", "title" FROM "posts" WHERE
// "posts"."user_id" = "u"."id" LIMIT 1) AS "rp" ON TRUE
// MariaDB returns ErrUnsupported
func (*Query[T]) JoinSub ¶ added in v0.2.0
JoinSub joins a subquery: "INNER JOIN (SELECT ...) AS alias ON ...".
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").JoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" INNER JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1)
// AS "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*Query[T]) JoinSubFunc ¶ added in v0.2.0
func (q *Query[T]) JoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *Query[T]
JoinSubFunc joins a subquery with a complex ON clause built in fn.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").JoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.score", ">", 10)
})
// SELECT * FROM "users" AS "u" INNER JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id" AND "p"."score" > $1
// args: [10]
func (*Query[T]) JoinWhere ¶ added in v0.2.0
JoinWhere joins on a bound value: "INNER JOIN t ON col = ?".
Example:
conn.Select().From("users as u").JoinWhere("posts as p", "p.status", "published")
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."status" = $1
// args: [published]
func (*Query[T]) Latest ¶
Latest orders by column descending (default "created_at").
Example:
conn.Select().From("posts").Latest("published_at")
// SELECT * FROM "posts" ORDER BY "published_at" DESC
func (*Query[T]) LeftJoin ¶
LeftJoin adds a left join.
Example:
conn.Select().From("users as u").LeftJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*Query[T]) LeftJoinFunc ¶
func (q *Query[T]) LeftJoinFunc(table string, fn func(*JoinClause)) *Query[T]
LeftJoinFunc adds a left join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").LeftJoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNull("p.deleted_at")
})
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."deleted_at" IS NULL
func (*Query[T]) LeftJoinLateral ¶ added in v0.2.0
func (q *Query[T]) LeftJoinLateral(sub *SelectBuilder, as string) *Query[T]
LeftJoinLateral is JoinLateral as a left join.
Example:
recent := conn.Select().From("posts").Select("id", "title").
WhereColumn("posts.user_id", "u.id").Limit(1)
conn.Select().From("users as u").LeftJoinLateral(recent, "rp")
// SELECT * FROM "users" AS "u" LEFT JOIN LATERAL (SELECT "id", "title" FROM "posts" WHERE
// "posts"."user_id" = "u"."id" LIMIT 1) AS "rp" ON TRUE
func (*Query[T]) LeftJoinSub ¶ added in v0.2.0
LeftJoinSub joins a subquery with a left join.
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").LeftJoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" LEFT JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1) AS
// "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*Query[T]) LeftJoinSubFunc ¶ added in v0.2.0
func (q *Query[T]) LeftJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *Query[T]
LeftJoinSubFunc is JoinSubFunc as a left join.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").LeftJoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNotNull("p.score")
})
// SELECT * FROM "users" AS "u" LEFT JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id" AND "p"."score" IS NOT NULL
func (*Query[T]) LeftJoinWhere ¶ added in v0.2.0
LeftJoinWhere is JoinWhere as a left join.
Example:
conn.Select().From("users as u").LeftJoinWhere("posts as p", "p.score", ">", 10)
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."score" > $1
// args: [10]
func (*Query[T]) Limit ¶
Limit sets LIMIT; negative values are ignored.
Example:
conn.Select().From("users").Limit(10)
// SELECT * FROM "users" LIMIT 10
func (*Query[T]) Lock ¶ added in v0.2.0
Lock appends a raw locking clause such as "FOR NO KEY UPDATE" (caller-trusted SQL; ignored on SQLite).
Example:
conn.Select().From("jobs").Where("state", "queued").Limit(1).Lock("FOR NO KEY UPDATE")
// SELECT * FROM "jobs" WHERE "state" = $1 LIMIT 1 FOR NO KEY UPDATE args: [queued]
func (*Query[T]) LockForUpdate ¶
LockForUpdate adds "FOR UPDATE" (Postgres, MySQL; ignored on SQLite).
Example:
conn.Select().From("accounts").Where("id", 1).LockForUpdate()
// Postgres: SELECT * FROM "accounts" WHERE "id" = $1 FOR UPDATE args: [1]
// MySQL: SELECT * FROM `accounts` WHERE `id` = ? FOR UPDATE args: [1]
func (*Query[T]) Offset ¶
Offset sets OFFSET; negative values clamp to 0.
Example:
conn.Select().From("users").Limit(10).Offset(20)
// SELECT * FROM "users" LIMIT 10 OFFSET 20
func (*Query[T]) Oldest ¶
Oldest orders by column ascending (default "created_at").
Example:
conn.Select().From("posts").Oldest()
// SELECT * FROM "posts" ORDER BY "created_at" ASC
func (*Query[T]) OrHaving ¶ added in v0.2.0
OrHaving is Having joined with OR.
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
Having("user_id", ">", 10).OrHaving("user_id", 1)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING "user_id" > $1 OR "user_id" = $2
// args: [10 1]
func (*Query[T]) OrHavingBetween ¶ added in v0.2.0
OrHavingBetween is HavingBetween joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingBetween("spent", 100, 500).OrHavingBetween("user_id", 1, 3)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent"
// BETWEEN $1 AND $2 OR "user_id" BETWEEN $3 AND $4
// args: [100 500 1 3]
func (*Query[T]) OrHavingGroup ¶ added in v0.2.0
func (q *Query[T]) OrHavingGroup(fn func(*HavingClause)) *Query[T]
OrHavingGroup is HavingGroup joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
SelectRaw("count(*) as n").Having("n", ">", 1).OrHavingGroup(func(q *db.HavingClause) {
q.Having("spent", ">", 100).Having("n", "<", 3)
})
// SELECT "user_id", sum(total) as spent, count(*) as n FROM "orders" GROUP BY "user_id"
// HAVING "n" > $1 OR ("spent" > $2 AND "n" < $3)
// args: [1 100 3]
func (*Query[T]) OrHavingNotBetween ¶ added in v0.2.0
OrHavingNotBetween is HavingNotBetween joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotBetween("spent", 100, 500).OrHavingNotBetween("user_id", 1, 3)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" NOT
// BETWEEN $1 AND $2 OR "user_id" NOT BETWEEN $3 AND $4
// args: [100 500 1 3]
func (*Query[T]) OrHavingNotNull ¶ added in v0.2.0
OrHavingNotNull is HavingNotNull joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotNull("spent").OrHavingNotNull("user_id")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NOT NULL OR "user_id" IS NOT NULL
func (*Query[T]) OrHavingNull ¶ added in v0.2.0
OrHavingNull is HavingNull joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNull("spent").OrHavingNull("user_id")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NULL OR "user_id" IS NULL
func (*Query[T]) OrHavingRaw ¶ added in v0.2.0
OrHavingRaw is HavingRaw joined with OR.
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
HavingRaw("sum(amount) > ?", 100).OrHavingRaw("count(*) > ?", 5)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING sum(amount) > $1 OR count(*) > $2
// args: [100 5]
func (*Query[T]) OrWhere ¶
OrWhere is Where joined with OR.
Example:
conn.Select().From("users").Where("role", "admin").OrWhere("role", "owner")
// SELECT * FROM "users" WHERE "role" = $1 OR "role" = $2
// args: [admin owner]
func (*Query[T]) OrWhereAll ¶ added in v0.2.0
OrWhereAll is WhereAll joined with OR.
Example:
conn.Select().From("users").WhereAll([]string{"a", "b"}, 1).OrWhereAll([]string{"c", "d"}, ">", 5)
// SELECT * FROM "users" WHERE ("a" = $1 AND "b" = $2) OR ("c" > $3 AND "d" > $4)
// args: [1 1 5 5]
func (*Query[T]) OrWhereAny ¶ added in v0.2.0
OrWhereAny is WhereAny joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereAny([]string{"a", "b"}, ">", 5)
// SELECT * FROM "users" WHERE "active" = $1 OR ("a" > $2 OR "b" > $3) args: [true 5 5]
func (*Query[T]) OrWhereBetween ¶ added in v0.2.0
OrWhereBetween is WhereBetween joined with OR.
Example:
conn.Select().From("orders").Where("status", "paid").OrWhereBetween("total", 500, 900)
// SELECT * FROM "orders" WHERE "status" = $1 OR "total" BETWEEN $2 AND $3
// args: [paid 500 900]
func (*Query[T]) OrWhereBetweenColumns ¶ added in v0.2.0
OrWhereBetweenColumns is WhereBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price").
OrWhereBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price" OR "cost"
// BETWEEN "low" AND "high"
func (*Query[T]) OrWhereColumn ¶ added in v0.2.0
OrWhereColumn is WhereColumn joined with OR.
Example:
conn.Select().From("users").WhereColumn("first_name", "last_name").OrWhereColumn("a", "<>", "b")
// SELECT * FROM "users" WHERE "first_name" = "last_name" OR "a" <> "b"
func (*Query[T]) OrWhereDate ¶ added in v0.2.0
OrWhereDate is WhereDate joined with OR.
Example:
conn.Select().From("orders").WhereDate("created_at", "2024-01-15").
OrWhereDate("created_at", "2024-02-01")
// SELECT * FROM "orders" WHERE "created_at"::DATE = $1 OR "created_at"::DATE = $2
// args: [2024-01-15 2024-02-01]
func (*Query[T]) OrWhereDay ¶ added in v0.2.0
OrWhereDay is WhereDay joined with OR.
Example:
conn.Select().From("orders").WhereDay("created_at", 15).OrWhereDay("created_at", ">", 20)
// SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 OR EXTRACT(DAY FROM
// "created_at") > $2
// args: [15 20]
func (*Query[T]) OrWhereExists ¶ added in v0.2.0
func (q *Query[T]) OrWhereExists(sub *SelectBuilder) *Query[T]
OrWhereExists is WhereExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*Query[T]) OrWhereGroup ¶
func (q *Query[T]) OrWhereGroup(fn func(*WhereClause)) *Query[T]
OrWhereGroup is WhereGroup joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").Where("age", ">", 30)
})
// SELECT * FROM "users" WHERE "active" = $1 OR ("role" = $2 AND "age" > $3)
// args: [true admin 30]
func (*Query[T]) OrWhereIn ¶
OrWhereIn is WhereIn joined with OR.
Example:
conn.Select().From("users").WhereIn("role", []string{"ann", "bob"}).OrWhereIn("id", []int{9})
// SELECT * FROM "users" WHERE "role" IN ($1, $2) OR "id" IN ($3) args: [ann bob 9]
func (*Query[T]) OrWhereIntegerInRaw ¶ added in v0.2.0
OrWhereIntegerInRaw is WhereIntegerInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1}).
OrWhereIntegerInRaw("id", []int64{7, 8})
// SELECT * FROM "users" WHERE "id" IN (1) OR "id" IN (7, 8)
func (*Query[T]) OrWhereIntegerNotInRaw ¶ added in v0.2.0
OrWhereIntegerNotInRaw is WhereIntegerNotInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2}).
OrWhereIntegerNotInRaw("id", []int{3})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2) OR "id" NOT IN (3)
func (*Query[T]) OrWhereJsonContains ¶ added in v0.2.0
OrWhereJsonContains is WhereJsonContains joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR ("options"->'tags')::JSONB @> $2
// args: [true "go"]
func (*Query[T]) OrWhereJsonContainsKey ¶ added in v0.2.0
OrWhereJsonContainsKey is WhereJsonContainsKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*Query[T]) OrWhereJsonDoesntContain ¶ added in v0.2.0
OrWhereJsonDoesntContain is WhereJsonDoesntContain joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("options"->'tags')::JSONB @> $2
// args: [true "php"]
func (*Query[T]) OrWhereJsonDoesntContainKey ¶ added in v0.2.0
OrWhereJsonDoesntContainKey is WhereJsonDoesntContainKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).
OrWhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1
// OR NOT COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*Query[T]) OrWhereJsonDoesntOverlap ¶ added in v0.2.0
OrWhereJsonDoesntOverlap is WhereJsonDoesntOverlap joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["php"]]
func (*Query[T]) OrWhereJsonLength ¶ added in v0.2.0
OrWhereJsonLength is WhereJsonLength joined with OR.
Example:
conn.Select().From("users").WhereJsonLength("options->tags", 0)
.OrWhereJsonLength("options->roles", ">=", 3).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// OR JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) >= $2 args: [0 3]
func (*Query[T]) OrWhereJsonOverlaps ¶ added in v0.2.0
OrWhereJsonOverlaps is WhereJsonOverlaps joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonOverlaps("options->tags", []string{"go"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["go"]]
func (*Query[T]) OrWhereLike ¶ added in v0.2.0
OrWhereLike is WhereLike joined with OR.
Example:
conn.Select().From("users").WhereLike("name", "an%").OrWhereLike("name", "bo%")
// SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 OR "name"::TEXT ILIKE $2
// args: [an% bo%]
func (*Query[T]) OrWhereMap ¶ added in v0.2.0
OrWhereMap is WhereMap joined with OR.
Example:
conn.Select().From("users").WhereMap(map[string]any{"a": 1}).OrWhereMap(map[string]any{"b": 2})
// SELECT * FROM "users" WHERE ("a" = $1) OR ("b" = $2) args: [1 2]
func (*Query[T]) OrWhereMonth ¶ added in v0.2.0
OrWhereMonth is WhereMonth joined with OR.
Example:
conn.Select().From("orders").WhereMonth("created_at", ">=", 6).OrWhereMonth("created_at", 1)
// SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") >= $1 OR EXTRACT(MONTH FROM
// "created_at") = $2
// args: [06 01]
func (*Query[T]) OrWhereNone ¶ added in v0.2.0
OrWhereNone is WhereNone joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereNone([]string{"a", "b"}, 0)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("a" = $2 OR "b" = $3)
// args: [true 0 0]
func (*Query[T]) OrWhereNot ¶ added in v0.2.0
OrWhereNot adds "OR NOT <predicate>".
Example:
conn.Select().From("users").Where("age", ">", 18).OrWhereNot("status", "<", 3)
// SELECT * FROM "users" WHERE "age" > $1 OR NOT "status" < $2 args: [18 3]
func (*Query[T]) OrWhereNotBetween ¶ added in v0.2.0
OrWhereNotBetween is WhereNotBetween joined with OR.
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100).OrWhereNotBetween("qty", 1, 5)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 OR "qty" NOT BETWEEN $3 AND $4
// args: [10 100 1 5]
func (*Query[T]) OrWhereNotBetweenColumns ¶ added in v0.2.0
OrWhereNotBetweenColumns is WhereNotBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price").
OrWhereNotBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price" OR "cost"
// NOT BETWEEN "low" AND "high"
func (*Query[T]) OrWhereNotExists ¶ added in v0.2.0
func (q *Query[T]) OrWhereNotExists(sub *SelectBuilder) *Query[T]
OrWhereNotExists is WhereNotExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereNotExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*Query[T]) OrWhereNotIn ¶ added in v0.2.0
OrWhereNotIn is WhereNotIn joined with OR.
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2}).OrWhereNotIn("role", []string{"ann"})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) OR "role" NOT IN ($3) args: [1 2 ann]
func (*Query[T]) OrWhereNotLike ¶ added in v0.2.0
OrWhereNotLike is WhereNotLike joined with OR.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%").OrWhereNotLike("name", "%demo%", true)
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 OR "name"::TEXT NOT LIKE $2
// args: [%test% %demo%]
func (*Query[T]) OrWhereNotNull ¶ added in v0.2.0
OrWhereNotNull is WhereNotNull joined with OR.
Example:
conn.Select().From("users").WhereNotNull("verified_at").OrWhereNotNull("invited_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL OR "invited_at" IS NOT NULL
func (*Query[T]) OrWhereNull ¶
OrWhereNull is WhereNull joined with OR.
Example:
conn.Select().From("users").WhereNull("deleted_at").OrWhereNull("banned_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL OR "banned_at" IS NULL
func (*Query[T]) OrWhereNullSafeEquals ¶ added in v0.2.0
OrWhereNullSafeEquals is WhereNullSafeEquals joined with OR.
Example:
conn.Select().From("users").WhereNullSafeEquals("a", 1).OrWhereNullSafeEquals("b", 2)
// SELECT * FROM "users" WHERE "a" IS NOT DISTINCT FROM $1 OR "b" IS NOT DISTINCT FROM $2
// args: [1 2]
func (*Query[T]) OrWhereRaw ¶
OrWhereRaw is WhereRaw joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereRaw("age between ? and ?", 18, 30)
// SELECT * FROM "users" WHERE "active" = $1 OR age between $2 and $3
// args: [true 18 30]
func (*Query[T]) OrWhereRowValues ¶ added in v0.2.0
OrWhereRowValues is WhereRowValues joined with OR.
Example:
conn.Select().From("events").Where("kind", "x").
OrWhereRowValues([]string{"a", "b"}, "=", []any{1, 2})
// SELECT * FROM "events" WHERE "kind" = $1 OR ("a", "b") = ($2, $3) args: [x 1 2]
func (*Query[T]) OrWhereTime ¶ added in v0.2.0
OrWhereTime is WhereTime joined with OR.
Example:
conn.Select().From("orders").WhereTime("created_at", "10:30:00").
OrWhereTime("created_at", "<", "08:00:00")
// SELECT * FROM "orders" WHERE "created_at"::TIME = $1 OR "created_at"::TIME < $2
// args: [10:30:00 08:00:00]
func (*Query[T]) OrWhereValueBetween ¶ added in v0.2.0
OrWhereValueBetween is WhereValueBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total").
OrWhereValueBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" OR $2 BETWEEN "a" AND
// "b"
// args: [50 7]
func (*Query[T]) OrWhereValueNotBetween ¶ added in v0.2.0
OrWhereValueNotBetween is WhereValueNotBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total").
OrWhereValueNotBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" OR $2 NOT BETWEEN
// "a" AND "b"
// args: [50 7]
func (*Query[T]) OrWhereYear ¶ added in v0.2.0
OrWhereYear is WhereYear joined with OR.
Example:
conn.Select().From("orders").WhereYear("created_at", ">", 2020).OrWhereYear("created_at", 1999)
// SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") > $1 OR EXTRACT(YEAR FROM
// "created_at") = $2
// args: [2020 1999]
func (*Query[T]) OrderBy ¶
OrderBy adds ORDER BY column; direction is "asc" (default) or "desc".
Example:
conn.Select().From("users").OrderBy("name").OrderBy("age", "desc")
// SELECT * FROM "users" ORDER BY "name" ASC, "age" DESC
func (*Query[T]) OrderByDesc ¶
OrderByDesc is OrderBy(column, "desc").
Example:
conn.Select().From("users").OrderByDesc("created_at")
// SELECT * FROM "users" ORDER BY "created_at" DESC
func (*Query[T]) OrderByRaw ¶
OrderByRaw adds a raw ORDER BY expression (caller-trusted SQL).
Example:
conn.Select().From("users").OrderByRaw("case when role = ? then 0 else 1 end", "admin")
// SELECT * FROM "users" ORDER BY case when role = $1 then 0 else 1 end
// args: [admin]
func (*Query[T]) Paginate ¶
Paginate counts the rows, then returns the requested 1-based page.
Example:
p, err := db.From[User](conn).OrderBy("id").Paginate(ctx, 2, 2)
// SELECT COUNT(*) AS "aggregate" FROM "users" args: []
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 2 OFFSET 2 args: []
// p.Items: [{3 cy 41}], p.Total: 3, p.CurrentPage: 2, p.LastPage: 2
func (*Query[T]) Reorder ¶ added in v0.2.0
Reorder removes all existing ORDER BY clauses (including a union's).
Example:
conn.Select().From("posts").OrderBy("title").Reorder()
// SELECT * FROM "posts"
func (*Query[T]) ReorderBy ¶ added in v0.2.0
ReorderBy is Reorder followed by OrderBy(column, direction).
Example:
conn.Select().From("posts").OrderBy("title").ReorderBy("id", "desc")
// SELECT * FROM "posts" ORDER BY "id" DESC
func (*Query[T]) RightJoin ¶
RightJoin adds a right join.
Example:
conn.Select().From("users as u").RightJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*Query[T]) RightJoinFunc ¶ added in v0.2.0
func (q *Query[T]) RightJoinFunc(table string, fn func(*JoinClause)) *Query[T]
RightJoinFunc adds a right join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").RightJoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.score", ">", 10)
})
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."score" > $1
// args: [10]
func (*Query[T]) RightJoinSub ¶ added in v0.2.0
RightJoinSub joins a subquery with a right join.
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").RightJoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" RIGHT JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1)
// AS "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*Query[T]) RightJoinSubFunc ¶ added in v0.2.0
func (q *Query[T]) RightJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *Query[T]
RightJoinSubFunc is JoinSubFunc as a right join.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").RightJoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id")
})
// SELECT * FROM "users" AS "u" RIGHT JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id"
func (*Query[T]) RightJoinWhere ¶ added in v0.2.0
RightJoinWhere is JoinWhere as a right join.
Example:
conn.Select().From("users as u").RightJoinWhere("posts as p", "p.status", "published")
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."status" = $1
// args: [published]
func (*Query[T]) Select ¶
Select replaces the selected columns.
Example:
conn.Select().From("users as u").Select("u.id", "u.name as full_name")
// SELECT "u"."id", "u"."name" AS "full_name" FROM "users" AS "u"
func (*Query[T]) SelectRaw ¶
SelectRaw appends a raw select expression.
Example:
conn.Select().From("orders").Select("user_id").
SelectRaw("sum(amount) * ? as total", 1.1).GroupBy("user_id")
// SELECT "user_id", sum(amount) * $1 as total FROM "orders" GROUP BY "user_id"
// args: [1.1]
func (*Query[T]) SelectSub ¶ added in v0.2.0
func (q *Query[T]) SelectSub(sub *SelectBuilder, as string) *Query[T]
SelectSub appends "(subquery) as alias" to the select list. The subquery is snapshotted: later changes to sub do not affect this query.
Example:
n := conn.Select().From("posts").SelectRaw("count(*)").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Select("name").SelectSub(n, "post_count")
// SELECT "name", (SELECT count(*) FROM "posts" WHERE "posts"."user_id" = "users"."id") AS
// "post_count" FROM "users"
func (*Query[T]) SharedLock ¶
SharedLock adds "FOR SHARE" (Postgres) or "LOCK IN SHARE MODE" (MySQL); ignored on SQLite.
Example:
conn.Select().From("accounts").Where("id", 1).SharedLock()
// Postgres: SELECT * FROM "accounts" WHERE "id" = $1 FOR SHARE args: [1]
// MySQL: SELECT * FROM `accounts` WHERE `id` = ? LOCK IN SHARE MODE args: [1]
func (*Query[T]) SimplePaginate ¶
SimplePaginate returns a page and whether another follows, without a count query.
Example:
p, err := db.From[User](conn).OrderBy("id").SimplePaginate(ctx, 1, 2)
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 3 OFFSET 0 args: []
// len(p.Items): 2, p.HasMore: true
func (*Query[T]) Skip ¶ added in v0.2.0
Skip is an alias of Offset.
Example:
conn.Select().From("users").Take(10).Skip(5)
// SELECT * FROM "users" LIMIT 10 OFFSET 5
func (*Query[T]) Sole ¶
Sole returns the only matching row: ErrNotFound for none, ErrMultipleRecords for several.
Example:
u, err := db.From[User](conn).Where("name", "ann").Sole(ctx)
// SELECT * FROM "users" WHERE "name" = $1 LIMIT 2 args: [ann]
// u.Name: ann; two rows: err is ErrMultipleRecords
func (*Query[T]) StraightJoin ¶ added in v0.2.0
StraightJoin adds a MySQL "straight_join"; other dialects error at compile time.
Example:
connMy.Select().From("users as u").StraightJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM `users` AS `u` STRAIGHT_JOIN `posts` AS `p` ON `p`.`user_id` = `u`.`id`
// connMy is db.Use(db.MySQL); other dialects return ErrUnsupported
func (*Query[T]) Stream ¶
Stream yields rows one at a time; break out of the loop to stop early.
Example:
for u, err := range db.From[User](conn).Stream(ctx) {
if err != nil {
break
}
fmt.Println(u.Name) // ann, then bob
}
// SELECT * FROM "users" args: []
func (*Query[T]) Sum ¶
Sum returns sum(column) as float64 (0 when there are no rows).
Example:
total, err := db.From[User](conn).Sum(ctx, "age")
// SELECT SUM("age") AS "aggregate" FROM "users" args: []
// total: 86
func (*Query[T]) Take ¶ added in v0.2.0
Take is an alias of Limit.
Example:
conn.Select().From("users").Take(5)
// SELECT * FROM "users" LIMIT 5
func (*Query[T]) Union ¶ added in v0.2.0
func (q *Query[T]) Union(sub *SelectBuilder) *Query[T]
Union appends "UNION (query)". After a union, OrderBy/Limit/Offset apply to the combined result. On SQLite members are wrapped as "SELECT * FROM (...)".
Example:
a := conn.Select().From("users").Select("name").Where("active", true)
b := conn.Select().From("admins").Select("name")
a.Union(b).OrderBy("name").Limit(10)
// (SELECT "name" FROM "users" WHERE "active" = $1) UNION (SELECT "name" FROM "admins") ORDER
// BY "name" ASC LIMIT 10
// args: [true]
func (*Query[T]) UnionAll ¶ added in v0.2.0
func (q *Query[T]) UnionAll(sub *SelectBuilder) *Query[T]
UnionAll appends "UNION ALL (query)".
Example:
a := conn.Select().From("users").Select("name").Where("active", true)
b := conn.Select().From("admins").Select("name")
a.UnionAll(b).OrderBy("name").Limit(10)
// (SELECT "name" FROM "users" WHERE "active" = $1) UNION ALL (SELECT "name" FROM "admins")
// ORDER BY "name" ASC LIMIT 10
// args: [true]
func (*Query[T]) Unless ¶
Unless runs fn when cond is false.
Example:
db.From[User](conn).Unless(includeMinors, func(q *db.Query[User]) { q.Where("age", ">=", 18) })
// includeMinors == false: SELECT * FROM "users" WHERE "age" >= $1 args: [18]
func (*Query[T]) UseIndex ¶ added in v0.2.0
UseIndex adds "USE INDEX (a, b)" (MySQL; ignored on Postgres and SQLite). Index names are emitted unquoted and validated against [a-zA-Z0-9_$].
Example:
conn.Select().From("users").UseIndex("idx_email").Where("active", true)
// SELECT * FROM `users` USE INDEX (idx_email) WHERE `active` = ? args: [true]
func (*Query[T]) When ¶
When runs fn when cond is true.
Example:
db.From[User](conn).When(onlyAdults, func(q *db.Query[User]) { q.Where("age", ">=", 18) })
// onlyAdults == true: SELECT * FROM "users" WHERE "age" >= $1 args: [18]
func (*Query[T]) Where ¶
Where adds an AND predicate. Forms: Where(col, value) means "="; Where(col, op, value). A nil value with "=" / "!=" / "<>" becomes IS [NOT] NULL.
Example:
conn.Select().From("users").Where("active", true).Where("age", ">=", 18)
// SELECT * FROM "users" WHERE "active" = $1 AND "age" >= $2
// args: [true 18]
func (*Query[T]) WhereAll ¶ added in v0.2.0
WhereAll requires the predicate to hold for every column: (a = ? and b = ?).
Example:
conn.Select().From("users").WhereAll([]string{"first_name", "last_name"}, "like", "an%")
// SELECT * FROM "users" WHERE ("first_name"::TEXT LIKE $1 AND "last_name"::TEXT LIKE $2)
// args: [an% an%]
func (*Query[T]) WhereAny ¶ added in v0.2.0
WhereAny requires the predicate to hold for at least one column: (a = ? or b = ?).
Example:
conn.Select().From("users").WhereAny([]string{"first_name", "last_name"}, "ann")
// SELECT * FROM "users" WHERE ("first_name" = $1 OR "last_name" = $2) args: [ann ann]
func (*Query[T]) WhereBetween ¶
WhereBetween adds "col BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" BETWEEN $1 AND $2 args: [10 100]
func (*Query[T]) WhereBetweenColumns ¶ added in v0.2.0
WhereBetweenColumns adds "col BETWEEN c1 AND c2" comparing against columns.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price"
func (*Query[T]) WhereColumn ¶
WhereColumn compares two columns: WhereColumn(a, b) means "=", or WhereColumn(a, op, b).
Example:
conn.Select().From("users").WhereColumn("updated_at", ">", "created_at")
// SELECT * FROM "users" WHERE "updated_at" > "created_at"
func (*Query[T]) WhereDate ¶ added in v0.2.0
WhereDate compares the date part of a column.
Example:
conn.Select().From("orders").WhereDate("created_at", ">=", "2024-01-15")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::DATE >= $1 args: [2024-01-15]
// MySQL: SELECT * FROM `orders` WHERE DATE(`created_at`) >= ? args: [2024-01-15]
// SQLite: SELECT * FROM "orders" WHERE STRFTIME('%Y-%m-%d', "created_at") >= CAST(? AS TEXT)
// args: [2024-01-15]
func (*Query[T]) WhereDay ¶ added in v0.2.0
WhereDay compares the day-of-month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereDay("created_at", 15)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 args: [15]
// MySQL: SELECT * FROM `orders` WHERE DAY(`created_at`) = ? args: [15]
func (*Query[T]) WhereExists ¶
func (q *Query[T]) WhereExists(sub *SelectBuilder) *Query[T]
WhereExists adds "EXISTS (subquery)". Build sub with DB.Select.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereExists(posts)
// SELECT * FROM "users" WHERE EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*Query[T]) WhereGroup ¶
func (q *Query[T]) WhereGroup(fn func(*WhereClause)) *Query[T]
WhereGroup wraps the predicates added inside fn in parentheses. fn receives a fresh WhereClause; only its Where* calls are used.
Example:
conn.Select().From("users").Where("active", true).WhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").OrWhere("role", "editor")
})
// SELECT * FROM "users" WHERE "active" = $1 AND ("role" = $2 OR "role" = $3)
// args: [true admin editor]
func (*Query[T]) WhereIn ¶
WhereIn adds "col IN (...)". values may be any slice, a scalar, or a *SelectBuilder subquery. An empty list compiles to the always-false "0 = 1".
Example:
conn.Select().From("users").WhereIn("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN ($1, $2, $3) args: [1 2 3]
func (*Query[T]) WhereIntegerInRaw ¶ added in v0.2.0
WhereIntegerInRaw inlines integers (no bind args); non-integers record an error. Useful for very large ID lists that would exceed driver parameter limits.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN (1, 2, 3)
func (*Query[T]) WhereIntegerNotInRaw ¶ added in v0.2.0
WhereIntegerNotInRaw is the negated WhereIntegerInRaw.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2)
func (*Query[T]) WhereJsonContains ¶ added in v0.2.0
WhereJsonContains adds a JSON containment test on a column or "col->path". MySQL json_contains, Postgres @> (jsonb), SQLite json_each membership.
Example:
conn.Select().From("users").WhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE ("options"->'tags')::JSONB @> $1 args: ["go"]
func (*Query[T]) WhereJsonContainsKey ¶ added in v0.2.0
WhereJsonContainsKey tests that the JSON path "col->key" exists.
Example:
conn.Select().From("users").WhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
// MySQL: SELECT * FROM `users`
// WHERE IFNULL(JSON_CONTAINS_PATH(`options`, 'one', '$."theme"'), 0)
func (*Query[T]) WhereJsonDoesntContain ¶ added in v0.2.0
WhereJsonDoesntContain negates WhereJsonContains.
Example:
conn.Select().From("users").WhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE NOT ("options"->'tags')::JSONB @> $1 args: ["php"]
func (*Query[T]) WhereJsonDoesntContainKey ¶ added in v0.2.0
WhereJsonDoesntContainKey negates WhereJsonContainsKey.
Example:
conn.Select().From("users").WhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE NOT COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
func (*Query[T]) WhereJsonDoesntOverlap ¶ added in v0.2.0
WhereJsonDoesntOverlap negates WhereJsonOverlaps.
Example:
conn.Select().From("users")
.WhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["php"]]
func (*Query[T]) WhereJsonLength ¶ added in v0.2.0
WhereJsonLength compares the length of a JSON array: (value) or (operator, value).
Example:
conn.Select().From("users")
.WhereJsonLength("options->tags", 2).WhereJsonLength("options->roles", ">", 1).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// AND JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) > $2 args: [2 1]
func (*Query[T]) WhereJsonOverlaps ¶ added in v0.2.0
WhereJsonOverlaps adds json_overlaps (MySQL only; other dialects error at compile time).
Example:
conn.Select().From("users")
.WhereJsonOverlaps("options->tags", []string{"go", "sql"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["go","sql"]]
func (*Query[T]) WhereLike ¶
WhereLike adds a LIKE predicate, case-insensitive unless caseSensitive[0] is true. Postgres: ILIKE/LIKE. MySQL: LIKE/LIKE BINARY. SQLite: LIKE/GLOB (pattern converted).
Example:
conn.Select().From("users").WhereLike("name", "An%")
// Postgres: SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 args: [An%]
// MySQL: SELECT * FROM `users` WHERE `name` LIKE ? args: [An%]
// SQLite: SELECT * FROM "users" WHERE "name" LIKE ? args: [An%]
func (*Query[T]) WhereMap ¶ added in v0.2.0
WhereMap adds one grouped "a = ? and b = ?" predicate; keys are sorted for stable SQL.
Example:
conn.Select().From("users").WhereMap(map[string]any{"role": "ann", "active": true})
// SELECT * FROM "users" WHERE ("active" = $1 AND "role" = $2) args: [true ann]
func (*Query[T]) WhereMonth ¶ added in v0.2.0
WhereMonth compares the month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereMonth("created_at", 3)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") = $1 args: [03]
// MySQL: SELECT * FROM `orders` WHERE MONTH(`created_at`) = ? args: [03]
func (*Query[T]) WhereNone ¶ added in v0.2.0
WhereNone requires the predicate to hold for no column: not (a = ? or b = ?).
Example:
conn.Select().From("users").WhereNone([]string{"first_name", "last_name"}, "like", "%test%")
// SELECT * FROM "users" WHERE NOT ("first_name"::TEXT LIKE $1 OR "last_name"::TEXT LIKE $2)
// args: [%test% %test%]
func (*Query[T]) WhereNot ¶
WhereNot adds "AND NOT <predicate>".
Example:
conn.Select().From("users").WhereNot("role", "admin")
// SELECT * FROM "users" WHERE NOT "role" = $1 args: [admin]
func (*Query[T]) WhereNotBetween ¶
WhereNotBetween adds "col NOT BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 args: [10 100]
func (*Query[T]) WhereNotBetweenColumns ¶ added in v0.2.0
WhereNotBetweenColumns is the negated WhereBetweenColumns.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price"
func (*Query[T]) WhereNotExists ¶
func (q *Query[T]) WhereNotExists(sub *SelectBuilder) *Query[T]
WhereNotExists adds "NOT EXISTS (subquery)".
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereNotExists(posts)
// SELECT * FROM "users" WHERE NOT EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*Query[T]) WhereNotIn ¶
WhereNotIn adds "col NOT IN (...)". An empty list compiles to "1 = 1".
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) args: [1 2]
func (*Query[T]) WhereNotLike ¶ added in v0.2.0
WhereNotLike is the negated WhereLike.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%")
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 args: [%test%]
func (*Query[T]) WhereNotNull ¶
WhereNotNull adds "col IS NOT NULL".
Example:
conn.Select().From("users").WhereNotNull("verified_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL
func (*Query[T]) WhereNull ¶
WhereNull adds "col IS NULL".
Example:
conn.Select().From("users").WhereNull("deleted_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL
func (*Query[T]) WhereNullSafeEquals ¶ added in v0.2.0
WhereNullSafeEquals compares with NULL-safe equality (<=>, IS NOT DISTINCT FROM, IS).
Example:
conn.Select().From("users").WhereNullSafeEquals("manager_id", 7)
// Postgres: SELECT * FROM "users" WHERE "manager_id" IS NOT DISTINCT FROM $1 args: [7]
// MySQL: SELECT * FROM `users` WHERE `manager_id` <=> ? args: [7]
func (*Query[T]) WhereRaw ¶
WhereRaw adds a raw predicate (caller-trusted SQL).
Example:
conn.Select().From("users").WhereRaw("lower(name) = ?", "ann")
// SELECT * FROM "users" WHERE lower(name) = $1
// args: [ann]
func (*Query[T]) WhereRowValues ¶ added in v0.2.0
WhereRowValues adds "(a, b) op (?, ?)".
Example:
conn.Select().From("events").
WhereRowValues([]string{"created_at", "id"}, ">", []any{"2024-01-15", 42})
// SELECT * FROM "events" WHERE ("created_at", "id") > ($1, $2) args: [2024-01-15 42]
func (*Query[T]) WhereTime ¶ added in v0.2.0
WhereTime compares the time part of a column.
Example:
conn.Select().From("orders").WhereTime("created_at", ">", "10:30:00")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::TIME > $1 args: [10:30:00]
// MySQL: SELECT * FROM `orders` WHERE TIME(`created_at`) > ? args: [10:30:00]
func (*Query[T]) WhereValueBetween ¶ added in v0.2.0
WhereValueBetween adds "? BETWEEN c1 AND c2" (a value between two columns).
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" args: [50]
func (*Query[T]) WhereValueNotBetween ¶ added in v0.2.0
WhereValueNotBetween is the negated WhereValueBetween.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" args: [50]
func (*Query[T]) WhereYear ¶ added in v0.2.0
WhereYear compares the year of a column.
Example:
conn.Select().From("orders").WhereYear("created_at", 2024)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") = $1
// args: [2024]
// MySQL: SELECT * FROM `orders` WHERE YEAR(`created_at`) = ? args: [2024]
func (*Query[T]) With ¶
func (q *Query[T]) With(name string, sub *SelectBuilder, opts ...CTEOption) *Query[T]
With adds a common table expression: "with name as (q)". The name is a table reference, so the table prefix applies to it as it does to From. The subquery is snapshotted: later changes to q do not affect this query. Options name the columns (CTEColumns) or hint materialization (CTEMaterialized, CTENotMaterialized).
On a select, a CTE can feed the query, a subquery, a union member, Count, Exists and Paginate. On an update or delete it is written before the verb (PostgreSQL, MySQL 8, SQLite; MariaDB returns ErrUnsupported). On an insert it is moved into the SELECT given to Using, so it needs Using.
Example:
active := conn.Select().From("users").Where("active", true)
conn.Select().From("active_users").With("active_users", active)
// WITH "active_users" AS (SELECT * FROM "users" WHERE "active" = $1) SELECT * FROM
// "active_users"
// args: [true]
func (*Query[T]) WithRaw ¶
func (q *Query[T]) WithRaw(name string, e Expression, opts ...CTEOption) *Query[T]
WithRaw adds a common table expression whose body is a raw SQL fragment (caller-trusted SQL), e.g. db.Raw("values (?), (?)", 1, 2). It takes the same options as With.
Example:
conn.Select().From("ids").WithRaw("ids", db.Raw("values (?), (?)", 1, 2), db.CTEColumns("id"))
// WITH "ids" ("id") AS (values ($1), ($2)) SELECT * FROM "ids"
// args: [1 2]
func (*Query[T]) WithRecursive ¶
func (q *Query[T]) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *Query[T]
WithRecursive adds a recursive common table expression and switches the clause to "with recursive". anchor is the starting query and step the recursive member that refers to name; they are joined with UNION ALL (CTEUnionDistinct for UNION) and written without parentheses, because SQLite rejects a recursive reference inside a subquery. Neither query is modified, and anchor must not have unions.
Example:
anchor := conn.Select().From("categories").Where("parent_id", nil)
step := conn.Select().From("categories as c").Join("tree as t", "c.parent_id", "t.id")
conn.Select().From("tree").WithRecursive("tree", anchor, step)
// WITH RECURSIVE "tree" AS (SELECT * FROM "categories" WHERE "parent_id" IS NULL UNION ALL
// SELECT * FROM "categories" AS "c" INNER JOIN "tree" AS "t" ON "c"."parent_id" =
// "t"."id") SELECT * FROM "tree"
type QueryEvent ¶
type QueryEvent struct {
SQL string
NumArgs int
Args []any // only set when WithLogArgs is enabled: bind values may be personal data
Duration time.Duration
Err error
}
QueryEvent describes one executed statement, for hooks.
Example:
hook := func(_ context.Context, ev db.QueryEvent) {
log.Println(ev.SQL, ev.NumArgs, ev.Duration, ev.Err)
}
conn := db.New(sqlDB, db.Postgres, db.WithHook(hook))
// ev.Args stays nil unless db.WithLogArgs() is also passed
type SelectBuilder ¶ added in v0.2.0
type SelectBuilder struct {
// contains filtered or unexported fields
}
SelectBuilder is a mutable, fluent SELECT query. Not safe for concurrent use; call Clone to branch a query. Start one with DB.Select.
Most chain methods are generated into chain_gen.go from the query type; the ones below take or return a SelectBuilder themselves.
func (*SelectBuilder) AddSelect ¶ added in v0.2.0
func (s *SelectBuilder) AddSelect(columns ...string) *SelectBuilder
AddSelect appends columns.
Example:
conn.Select().From("users").Select("id").AddSelect("name", "age")
// SELECT "id", "name", "age" FROM "users"
func (*SelectBuilder) Aggregate ¶ added in v0.2.0
Aggregate runs fn(column) and scans the result into dest (a pointer to a scalar). Min/Max/Sum over no rows yield NULL, which leaves dest at its zero value.
Example:
var total int64
err := conn.Select().From("orders").Aggregate(ctx, "sum", "total", &total)
// SELECT SUM("total") AS "aggregate" FROM "orders"
// total = 250
func (*SelectBuilder) AggregateSQL ¶ added in v0.2.0
AggregateSQL builds "SELECT fn(column) AS aggregate FROM ...". Queries with group by, having, union, distinct, limit or offset are wrapped as "SELECT fn(column) AS aggregate FROM (<query>) AS aggregate_table" so the aggregate covers the final row set. Ordering is dropped when it cannot matter.
Example:
sqlText, args, err := conn.Select().From("orders").Where("status", "paid").AggregateSQL("sum", "total")
// SELECT SUM("total") AS "aggregate" FROM "orders" WHERE "status" = $1 args: ["paid"]
func (*SelectBuilder) Avg ¶ added in v0.2.0
Avg returns avg(column) as float64 (0 when there are no rows).
Example:
avg, err := conn.Select().From("orders").Avg(ctx, "total")
// SELECT AVG("total") AS "aggregate" FROM "orders"
// avg = 50.1
func (*SelectBuilder) Chunk ¶ added in v0.2.0
func (s *SelectBuilder) Chunk(ctx context.Context, size int, dest any, fn func() (bool, error)) error
Chunk reads size rows at a time into dest (a pointer to a slice, refilled each round) and calls fn; return false to stop early. The query must have an ORDER BY (ErrNoOrder otherwise). It pages by offset, so rows changed by fn can be skipped or repeated: prefer ChunkByID when fn updates the filtered column.
Example:
var batch []User
err := conn.Select().From("users").OrderBy("id").Chunk(ctx, 2, &batch, func() (bool, error) {
return true, nil // false stops early
})
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 2 OFFSET 0
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 2 OFFSET 2 (until a short batch)
func (*SelectBuilder) ChunkByID ¶ added in v0.2.0
func (s *SelectBuilder) ChunkByID(ctx context.Context, size int, dest any, fn func() (bool, error), column ...string) error
ChunkByID is Chunk using keyset paging on a unique column (default "id"), so it is safe while fn updates or deletes the rows it was given. Any OrderBy on the query is replaced by the key order, and a query with a Union returns ErrInvalidArgs (wrap it with FromSub first).
Example:
var batch []User
err := conn.Select().From("users").ChunkByID(ctx, 2, &batch, func() (bool, error) {
return true, nil
})
// SELECT * FROM "users" WHERE "id" IS NOT NULL ORDER BY "id" ASC LIMIT 2
// SELECT * FROM "users" WHERE "id" > $1 ORDER BY "id" ASC LIMIT 2 args: [2]
// another key column: ChunkByID(ctx, 5, &batch, fn, "order_no")
func (*SelectBuilder) Clone ¶ added in v0.2.0
func (s *SelectBuilder) Clone() *SelectBuilder
Clone returns an independent copy. Cloning a nil *SelectBuilder returns nil.
Example:
base := conn.Select().From("users").Where("active", true)
admins := base.Clone().Where("role", "admin")
// base: SELECT * FROM "users" WHERE "active" = $1
// admins: SELECT * FROM "users" WHERE "active" = $1 AND "role" = $2
// args: [true admin] (admins)
func (*SelectBuilder) Count ¶ added in v0.2.0
Count returns count(*), or count(column) when a column is given.
Example:
n, err := conn.Select().From("users").Where("active", true).Count(ctx)
// SELECT COUNT(*) AS "aggregate" FROM "users" WHERE "active" = $1 args: [true]
// n = 3
n, err = conn.Select().From("users").Count(ctx, "email_verified_at")
// SELECT COUNT("email_verified_at") AS "aggregate" FROM "users"
func (*SelectBuilder) CrossJoin ¶ added in v0.2.0
func (s *SelectBuilder) CrossJoin(table string) *SelectBuilder
CrossJoin adds "CROSS JOIN table".
Example:
conn.Select().From("users").CrossJoin("roles")
// SELECT * FROM "users" CROSS JOIN "roles"
func (*SelectBuilder) CrossJoinSub ¶ added in v0.2.0
func (s *SelectBuilder) CrossJoinSub(sub *SelectBuilder, as string) *SelectBuilder
CrossJoinSub cross joins a subquery.
Example:
sub := conn.Select().From("roles").Select("name").Where("active", true)
conn.Select().From("users").CrossJoinSub(sub, "r")
// SELECT * FROM "users" CROSS JOIN (SELECT "name" FROM "roles" WHERE "active" = $1) AS "r"
// args: [true]
func (*SelectBuilder) CursorPaginate ¶ added in v0.2.0
func (s *SelectBuilder) CursorPaginate(ctx context.Context, perPage int, cursor string, dest any, opt ...CursorOptions) (CursorPage, error)
CursorPaginate pages forward by keyset on opt.Column. Pass the previous page's NextCursor (empty for the first page). It replaces any existing ORDER BY. The cursor is an opaque token; its value is only ever bound as an argument.
Example:
var users []User
p, err := conn.Select().From("users").CursorPaginate(ctx, 2, "", &users)
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 3
// next page: conn.Select().From("users").CursorPaginate(ctx, 2, p.NextCursor, &users)
// SELECT * FROM "users" WHERE "id" > $1 ORDER BY "id" ASC LIMIT 3 args: [2]
func (*SelectBuilder) Distinct ¶ added in v0.2.0
func (s *SelectBuilder) Distinct() *SelectBuilder
Distinct marks the query SELECT DISTINCT.
Example:
conn.Select().From("posts").Distinct().Select("user_id")
// SELECT DISTINCT "user_id" FROM "posts"
func (*SelectBuilder) DoesntExist ¶ added in v0.2.0
func (s *SelectBuilder) DoesntExist(ctx context.Context) (bool, error)
DoesntExist is the negation of Exists.
Example:
missing, err := conn.Select().From("users").Where("name", "zed").DoesntExist(ctx)
// SELECT EXISTS(SELECT * FROM "users" WHERE "name" = $1) AS "exists" args: ["zed"]
// missing = true when no row matches
func (*SelectBuilder) Each ¶ added in v0.2.0
Each streams rows one at a time into dest (a pointer to a struct, map or scalar, reset before every row) and calls fn, holding a single row in memory.
Example:
var u User
err := conn.Select().From("users").OrderBy("id").Each(ctx, &u, func() error {
fmt.Println(u.ID, u.Name) // u is refilled for every row
return nil
})
// SELECT * FROM "users" ORDER BY "id" ASC
func (*SelectBuilder) Err ¶ added in v0.2.0
func (s *SelectBuilder) Err() error
Err returns the first error recorded while building.
Example:
q := conn.Select().From("users").Where("id", "!!", 1)
err := q.Err()
// err: quill: invalid operator: "!!"
func (*SelectBuilder) Exists ¶ added in v0.2.0
func (s *SelectBuilder) Exists(ctx context.Context) (bool, error)
Exists reports whether any row matches.
Example:
ok, err := conn.Select().From("users").Where("name", "ann").Exists(ctx)
// SELECT EXISTS(SELECT * FROM "users" WHERE "name" = $1) AS "exists" args: ["ann"]
// ok = true
func (*SelectBuilder) ExistsSQL ¶ added in v0.2.0
func (s *SelectBuilder) ExistsSQL() (string, []any, error)
ExistsSQL builds "SELECT EXISTS(<query>) AS "exists"".
Example:
sqlText, args, err := conn.Select().From("users").Where("name", "ann").ExistsSQL()
// SELECT EXISTS(SELECT * FROM "users" WHERE "name" = $1) AS "exists" args: ["ann"]
func (*SelectBuilder) Find ¶ added in v0.2.0
Find is Where("id", id).First.
Example:
var u User
err := conn.Select().From("users").Find(ctx, 2, &u)
// SELECT * FROM "users" WHERE "id" = $1 LIMIT 1 args: [2]
func (*SelectBuilder) First ¶ added in v0.2.0
func (s *SelectBuilder) First(ctx context.Context, dest any) error
First scans the first row into dest (*struct, *map[string]any or *scalar). It returns ErrNotFound when nothing matches.
Example:
var u User
err := conn.Select().From("users").OrderBy("id").First(ctx, &u)
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 1
// no row: errors.Is(err, db.ErrNotFound) is true
func (*SelectBuilder) ForPage ¶ added in v0.2.0
func (s *SelectBuilder) ForPage(page int, perPage int) *SelectBuilder
ForPage sets offset/limit for a 1-based page.
Example:
conn.Select().From("users").OrderBy("id").ForPage(3, 25) // page 3, 25 rows per page
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 25 OFFSET 50
func (*SelectBuilder) ForPageAfterID ¶ added in v0.2.0
func (s *SelectBuilder) ForPageAfterID(perPage int, lastID any, column ...string) *SelectBuilder
ForPageAfterID pages forwards by keyset: "id > lastID ORDER BY id ASC LIMIT n".
Example:
conn.Select().From("posts").ForPageAfterID(10, 42)
// SELECT * FROM "posts" WHERE "id" > $1 ORDER BY "id" ASC LIMIT 10 args: [42]
func (*SelectBuilder) ForPageBeforeID ¶ added in v0.2.0
func (s *SelectBuilder) ForPageBeforeID(perPage int, lastID any, column ...string) *SelectBuilder
ForPageBeforeID pages backwards by keyset: "id < lastID ORDER BY id DESC LIMIT n". A nil lastID selects "id IS NOT NULL". column defaults to "id".
Example:
conn.Select().From("posts").ForPageBeforeID(10, 42)
// SELECT * FROM "posts" WHERE "id" < $1 ORDER BY "id" DESC LIMIT 10 args: [42]
func (*SelectBuilder) ForceIndex ¶ added in v0.2.0
func (s *SelectBuilder) ForceIndex(index string) *SelectBuilder
ForceIndex adds "FORCE INDEX (a)" (MySQL) or "INDEXED BY a" (SQLite, one name).
Example:
conn.Select().From("users").ForceIndex("idx_email").Where("active", true)
// MySQL: SELECT * FROM `users` FORCE INDEX (idx_email) WHERE `active` = ? args: [true]
// SQLite: SELECT * FROM "users" INDEXED BY idx_email WHERE "active" = ? args: [true]
func (*SelectBuilder) From ¶ added in v0.2.0
func (s *SelectBuilder) From(table string) *SelectBuilder
From sets the table ("users", "users as u", "schema.users").
Example:
db.Use(db.Postgres).Select().From("public.users as u")
// SELECT * FROM "public"."users" AS "u"
func (*SelectBuilder) FromRaw ¶ added in v0.2.0
func (s *SelectBuilder) FromRaw(sql string, args ...any) *SelectBuilder
FromRaw uses a raw SQL fragment as the source (caller-trusted SQL).
Example:
conn.Select().FromRaw("generate_series(?, ?) as g", 1, 3)
// SELECT * FROM generate_series($1, $2) as g args: [1 3]
func (*SelectBuilder) FromSub ¶ added in v0.2.0
func (s *SelectBuilder) FromSub(sub *SelectBuilder, as string) *SelectBuilder
FromSub uses "(subquery) as alias" as the source.
Example:
top := conn.Select().From("orders").SelectRaw("user_id, sum(total) as spent").GroupBy("user_id")
conn.Select().FromSub(top, "t").Where("spent", ">", 100)
// SELECT * FROM (SELECT user_id, sum(total) as spent FROM "orders" GROUP BY "user_id") AS
// "t" WHERE "spent" > $1
// args: [100]
func (*SelectBuilder) Get ¶ added in v0.2.0
func (s *SelectBuilder) Get(ctx context.Context, dest any) error
Get runs the query and scans every row into dest: a pointer to a slice of structs (`db:"col"` tags, else snake_case field names), pointers to structs, map[string]any, or scalars (single column). NULL leaves a plain field at its zero value; use pointer or sql.Null* fields to tell NULL apart.
Example:
var users []User // or []map[string]any, or []string for one column
err := conn.Select().From("users").Where("active", true).OrderBy("id").Get(ctx, &users)
// SELECT * FROM "users" WHERE "active" = $1 ORDER BY "id" ASC args: [true]
func (*SelectBuilder) GroupBy ¶ added in v0.2.0
func (s *SelectBuilder) GroupBy(columns ...string) *SelectBuilder
GroupBy adds GROUP BY columns.
Example:
conn.Select().From("orders").Select("user_id", "status").GroupBy("user_id", "status")
// SELECT "user_id", "status" FROM "orders" GROUP BY "user_id", "status"
func (*SelectBuilder) GroupByRaw ¶ added in v0.2.0
func (s *SelectBuilder) GroupByRaw(sql string, args ...any) *SelectBuilder
GroupByRaw adds a raw GROUP BY expression.
Example:
conn.Select().From("orders").SelectRaw("date_trunc('day', created_at) as day").
GroupByRaw("date_trunc('day', created_at)")
// SELECT date_trunc('day', created_at) as day FROM "orders" GROUP BY date_trunc('day',
// created_at)
func (*SelectBuilder) Having ¶ added in v0.2.0
func (s *SelectBuilder) Having(column string, args ...any) *SelectBuilder
Having adds an AND HAVING predicate; same argument forms as Where.
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
Having("user_id", ">", 10)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING "user_id" > $1
// args: [10]
func (*SelectBuilder) HavingBetween ¶ added in v0.2.0
func (s *SelectBuilder) HavingBetween(column string, lo any, hi any) *SelectBuilder
HavingBetween adds "col BETWEEN lo AND hi" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingBetween("spent", 100, 500)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent"
// BETWEEN $1 AND $2
// args: [100 500]
func (*SelectBuilder) HavingGroup ¶ added in v0.2.0
func (s *SelectBuilder) HavingGroup(fn func(*HavingClause)) *SelectBuilder
HavingGroup wraps the Having* predicates added inside fn in parentheses.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
SelectRaw("count(*) as n").HavingGroup(func(q *db.HavingClause) {
q.Having("spent", ">", 100).OrHaving("n", ">", 5)
})
// SELECT "user_id", sum(total) as spent, count(*) as n FROM "orders" GROUP BY "user_id"
// HAVING ("spent" > $1 OR "n" > $2)
// args: [100 5]
func (*SelectBuilder) HavingNotBetween ¶ added in v0.2.0
func (s *SelectBuilder) HavingNotBetween(column string, lo any, hi any) *SelectBuilder
HavingNotBetween adds "col NOT BETWEEN lo AND hi" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotBetween("spent", 100, 500)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" NOT
// BETWEEN $1 AND $2
// args: [100 500]
func (*SelectBuilder) HavingNotNull ¶ added in v0.2.0
func (s *SelectBuilder) HavingNotNull(column string) *SelectBuilder
HavingNotNull adds "col IS NOT NULL" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotNull("spent")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NOT NULL
func (*SelectBuilder) HavingNull ¶ added in v0.2.0
func (s *SelectBuilder) HavingNull(column string) *SelectBuilder
HavingNull adds "col IS NULL" to HAVING.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNull("spent")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NULL
func (*SelectBuilder) HavingRaw ¶ added in v0.2.0
func (s *SelectBuilder) HavingRaw(sql string, args ...any) *SelectBuilder
HavingRaw adds a raw HAVING predicate (caller-trusted SQL).
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
HavingRaw("sum(amount) > ?", 100)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING sum(amount) > $1
// args: [100]
func (*SelectBuilder) IgnoreIndex ¶ added in v0.2.0
func (s *SelectBuilder) IgnoreIndex(index string) *SelectBuilder
IgnoreIndex adds "IGNORE INDEX (a)" (MySQL; ignored elsewhere).
Example:
conn.Select().From("users").IgnoreIndex("idx_email").Where("active", true)
// SELECT * FROM `users` IGNORE INDEX (idx_email) WHERE `active` = ? args: [true]
func (*SelectBuilder) InRandomOrder ¶ added in v0.2.0
func (s *SelectBuilder) InRandomOrder(seed ...int) *SelectBuilder
InRandomOrder orders randomly: RANDOM() on Postgres/SQLite, RAND([seed]) on MySQL.
Example:
conn.Select().From("posts").InRandomOrder().Limit(5)
// Postgres: SELECT * FROM "posts" ORDER BY RANDOM() LIMIT 5
// MySQL: SELECT * FROM `posts` ORDER BY RAND() LIMIT 5
func (*SelectBuilder) Join ¶ added in v0.2.0
func (s *SelectBuilder) Join(table string, first string, args ...any) *SelectBuilder
Join adds "INNER JOIN table ON first = second" (or "first op second").
Example:
conn.Select().From("users as u").Join("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*SelectBuilder) JoinFunc ¶ added in v0.2.0
func (s *SelectBuilder) JoinFunc(table string, fn func(*JoinClause)) *SelectBuilder
JoinFunc adds an inner join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.published", true)
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."published" = $1
// args: [true]
func (*SelectBuilder) JoinLateral ¶ added in v0.2.0
func (s *SelectBuilder) JoinLateral(sub *SelectBuilder, as string) *SelectBuilder
JoinLateral adds "INNER JOIN LATERAL (subquery) AS alias ON TRUE" (Postgres, MySQL >= 8.0.14).
Example:
recent := conn.Select().From("posts").Select("id", "title").
WhereColumn("posts.user_id", "u.id").Limit(1)
conn.Select().From("users as u").JoinLateral(recent, "rp")
// SELECT * FROM "users" AS "u" INNER JOIN LATERAL (SELECT "id", "title" FROM "posts" WHERE
// "posts"."user_id" = "u"."id" LIMIT 1) AS "rp" ON TRUE
// MariaDB returns ErrUnsupported
func (*SelectBuilder) JoinSub ¶ added in v0.2.0
func (s *SelectBuilder) JoinSub(sub *SelectBuilder, as string, first string, args ...any) *SelectBuilder
JoinSub joins a subquery: "INNER JOIN (SELECT ...) AS alias ON ...".
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").JoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" INNER JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1)
// AS "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*SelectBuilder) JoinSubFunc ¶ added in v0.2.0
func (s *SelectBuilder) JoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *SelectBuilder
JoinSubFunc joins a subquery with a complex ON clause built in fn.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").JoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.score", ">", 10)
})
// SELECT * FROM "users" AS "u" INNER JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id" AND "p"."score" > $1
// args: [10]
func (*SelectBuilder) JoinWhere ¶ added in v0.2.0
func (s *SelectBuilder) JoinWhere(table string, column string, args ...any) *SelectBuilder
JoinWhere joins on a bound value: "INNER JOIN t ON col = ?".
Example:
conn.Select().From("users as u").JoinWhere("posts as p", "p.status", "published")
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."status" = $1
// args: [published]
func (*SelectBuilder) Latest ¶ added in v0.2.0
func (s *SelectBuilder) Latest(column ...string) *SelectBuilder
Latest orders by column descending (default "created_at").
Example:
conn.Select().From("posts").Latest("published_at")
// SELECT * FROM "posts" ORDER BY "published_at" DESC
func (*SelectBuilder) LeftJoin ¶ added in v0.2.0
func (s *SelectBuilder) LeftJoin(table string, first string, args ...any) *SelectBuilder
LeftJoin adds a left join.
Example:
conn.Select().From("users as u").LeftJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*SelectBuilder) LeftJoinFunc ¶ added in v0.2.0
func (s *SelectBuilder) LeftJoinFunc(table string, fn func(*JoinClause)) *SelectBuilder
LeftJoinFunc adds a left join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").LeftJoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNull("p.deleted_at")
})
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."deleted_at" IS NULL
func (*SelectBuilder) LeftJoinLateral ¶ added in v0.2.0
func (s *SelectBuilder) LeftJoinLateral(sub *SelectBuilder, as string) *SelectBuilder
LeftJoinLateral is JoinLateral as a left join.
Example:
recent := conn.Select().From("posts").Select("id", "title").
WhereColumn("posts.user_id", "u.id").Limit(1)
conn.Select().From("users as u").LeftJoinLateral(recent, "rp")
// SELECT * FROM "users" AS "u" LEFT JOIN LATERAL (SELECT "id", "title" FROM "posts" WHERE
// "posts"."user_id" = "u"."id" LIMIT 1) AS "rp" ON TRUE
func (*SelectBuilder) LeftJoinSub ¶ added in v0.2.0
func (s *SelectBuilder) LeftJoinSub(sub *SelectBuilder, as string, first string, args ...any) *SelectBuilder
LeftJoinSub joins a subquery with a left join.
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").LeftJoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" LEFT JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1) AS
// "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*SelectBuilder) LeftJoinSubFunc ¶ added in v0.2.0
func (s *SelectBuilder) LeftJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *SelectBuilder
LeftJoinSubFunc is JoinSubFunc as a left join.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").LeftJoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNotNull("p.score")
})
// SELECT * FROM "users" AS "u" LEFT JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id" AND "p"."score" IS NOT NULL
func (*SelectBuilder) LeftJoinWhere ¶ added in v0.2.0
func (s *SelectBuilder) LeftJoinWhere(table string, column string, args ...any) *SelectBuilder
LeftJoinWhere is JoinWhere as a left join.
Example:
conn.Select().From("users as u").LeftJoinWhere("posts as p", "p.score", ">", 10)
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."score" > $1
// args: [10]
func (*SelectBuilder) Limit ¶ added in v0.2.0
func (s *SelectBuilder) Limit(n int) *SelectBuilder
Limit sets LIMIT; negative values are ignored.
Example:
conn.Select().From("users").Limit(10)
// SELECT * FROM "users" LIMIT 10
func (*SelectBuilder) Lock ¶ added in v0.2.0
func (s *SelectBuilder) Lock(clause string) *SelectBuilder
Lock appends a raw locking clause such as "FOR NO KEY UPDATE" (caller-trusted SQL; ignored on SQLite).
Example:
conn.Select().From("jobs").Where("state", "queued").Limit(1).Lock("FOR NO KEY UPDATE")
// SELECT * FROM "jobs" WHERE "state" = $1 LIMIT 1 FOR NO KEY UPDATE args: [queued]
func (*SelectBuilder) LockForUpdate ¶ added in v0.2.0
func (s *SelectBuilder) LockForUpdate() *SelectBuilder
LockForUpdate adds "FOR UPDATE" (Postgres, MySQL; ignored on SQLite).
Example:
conn.Select().From("accounts").Where("id", 1).LockForUpdate()
// Postgres: SELECT * FROM "accounts" WHERE "id" = $1 FOR UPDATE args: [1]
// MySQL: SELECT * FROM `accounts` WHERE `id` = ? FOR UPDATE args: [1]
func (*SelectBuilder) Max ¶ added in v0.2.0
Max scans max(column) into dest.
Example:
var highest int64
err := conn.Select().From("orders").Max(ctx, "total", &highest)
// SELECT MAX("total") AS "aggregate" FROM "orders"
// highest = 90
func (*SelectBuilder) Min ¶ added in v0.2.0
Min scans min(column) into dest.
Example:
var lowest int64
err := conn.Select().From("orders").Min(ctx, "total", &lowest)
// SELECT MIN("total") AS "aggregate" FROM "orders"
// lowest = 10
func (*SelectBuilder) MustRawSQL ¶ added in v0.2.0
func (s *SelectBuilder) MustRawSQL() string
MustRawSQL is ToRawSQL that panics on error. DEBUG ONLY, like ToRawSQL: the result is not injection-safe. See MustSQL for when panicking is appropriate.
Example:
sql := conn.Select().From("users").Where("id", 42).Where("name", "ann").MustRawSQL()
// sql: SELECT * FROM "users" WHERE "id" = 42 AND "name" = 'ann'
// DEBUG ONLY: not injection-safe
func (*SelectBuilder) MustSQL ¶ added in v0.2.0
func (s *SelectBuilder) MustSQL() (string, []any)
MustSQL is ToSQL that panics on error instead of returning it. Use it for fixed queries (tests, examples, package-level vars) where an error means a programming mistake. Do not use it where an error can come from input, such as a user-chosen operator or column: handle ToSQL's error there. The panic value is the error, wrapped, so errors.Is still works on a recovered value.
Example:
sql, args := conn.Select().From("users").Where("id", 42).MustSQL()
// SELECT * FROM "users" WHERE "id" = $1
// args: [42]
func (*SelectBuilder) Offset ¶ added in v0.2.0
func (s *SelectBuilder) Offset(n int) *SelectBuilder
Offset sets OFFSET; negative values clamp to 0.
Example:
conn.Select().From("users").Limit(10).Offset(20)
// SELECT * FROM "users" LIMIT 10 OFFSET 20
func (*SelectBuilder) Oldest ¶ added in v0.2.0
func (s *SelectBuilder) Oldest(column ...string) *SelectBuilder
Oldest orders by column ascending (default "created_at").
Example:
conn.Select().From("posts").Oldest()
// SELECT * FROM "posts" ORDER BY "created_at" ASC
func (*SelectBuilder) OrHaving ¶ added in v0.2.0
func (s *SelectBuilder) OrHaving(column string, args ...any) *SelectBuilder
OrHaving is Having joined with OR.
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
Having("user_id", ">", 10).OrHaving("user_id", 1)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING "user_id" > $1 OR "user_id" = $2
// args: [10 1]
func (*SelectBuilder) OrHavingBetween ¶ added in v0.2.0
func (s *SelectBuilder) OrHavingBetween(column string, lo any, hi any) *SelectBuilder
OrHavingBetween is HavingBetween joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingBetween("spent", 100, 500).OrHavingBetween("user_id", 1, 3)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent"
// BETWEEN $1 AND $2 OR "user_id" BETWEEN $3 AND $4
// args: [100 500 1 3]
func (*SelectBuilder) OrHavingGroup ¶ added in v0.2.0
func (s *SelectBuilder) OrHavingGroup(fn func(*HavingClause)) *SelectBuilder
OrHavingGroup is HavingGroup joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
SelectRaw("count(*) as n").Having("n", ">", 1).OrHavingGroup(func(q *db.HavingClause) {
q.Having("spent", ">", 100).Having("n", "<", 3)
})
// SELECT "user_id", sum(total) as spent, count(*) as n FROM "orders" GROUP BY "user_id"
// HAVING "n" > $1 OR ("spent" > $2 AND "n" < $3)
// args: [1 100 3]
func (*SelectBuilder) OrHavingNotBetween ¶ added in v0.2.0
func (s *SelectBuilder) OrHavingNotBetween(column string, lo any, hi any) *SelectBuilder
OrHavingNotBetween is HavingNotBetween joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotBetween("spent", 100, 500).OrHavingNotBetween("user_id", 1, 3)
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" NOT
// BETWEEN $1 AND $2 OR "user_id" NOT BETWEEN $3 AND $4
// args: [100 500 1 3]
func (*SelectBuilder) OrHavingNotNull ¶ added in v0.2.0
func (s *SelectBuilder) OrHavingNotNull(column string) *SelectBuilder
OrHavingNotNull is HavingNotNull joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNotNull("spent").OrHavingNotNull("user_id")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NOT NULL OR "user_id" IS NOT NULL
func (*SelectBuilder) OrHavingNull ¶ added in v0.2.0
func (s *SelectBuilder) OrHavingNull(column string) *SelectBuilder
OrHavingNull is HavingNull joined with OR.
Example:
conn.Select().From("orders").Select("user_id").SelectRaw("sum(total) as spent").GroupBy("user_id").
HavingNull("spent").OrHavingNull("user_id")
// SELECT "user_id", sum(total) as spent FROM "orders" GROUP BY "user_id" HAVING "spent" IS
// NULL OR "user_id" IS NULL
func (*SelectBuilder) OrHavingRaw ¶ added in v0.2.0
func (s *SelectBuilder) OrHavingRaw(sql string, args ...any) *SelectBuilder
OrHavingRaw is HavingRaw joined with OR.
Example:
conn.Select().From("orders").Select("user_id").GroupBy("user_id").
HavingRaw("sum(amount) > ?", 100).OrHavingRaw("count(*) > ?", 5)
// SELECT "user_id" FROM "orders" GROUP BY "user_id" HAVING sum(amount) > $1 OR count(*) > $2
// args: [100 5]
func (*SelectBuilder) OrWhere ¶ added in v0.2.0
func (s *SelectBuilder) OrWhere(column string, args ...any) *SelectBuilder
OrWhere is Where joined with OR.
Example:
conn.Select().From("users").Where("role", "admin").OrWhere("role", "owner")
// SELECT * FROM "users" WHERE "role" = $1 OR "role" = $2
// args: [admin owner]
func (*SelectBuilder) OrWhereAll ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereAll(columns []string, args ...any) *SelectBuilder
OrWhereAll is WhereAll joined with OR.
Example:
conn.Select().From("users").WhereAll([]string{"a", "b"}, 1).OrWhereAll([]string{"c", "d"}, ">", 5)
// SELECT * FROM "users" WHERE ("a" = $1 AND "b" = $2) OR ("c" > $3 AND "d" > $4)
// args: [1 1 5 5]
func (*SelectBuilder) OrWhereAny ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereAny(columns []string, args ...any) *SelectBuilder
OrWhereAny is WhereAny joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereAny([]string{"a", "b"}, ">", 5)
// SELECT * FROM "users" WHERE "active" = $1 OR ("a" > $2 OR "b" > $3) args: [true 5 5]
func (*SelectBuilder) OrWhereBetween ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereBetween(column string, lo any, hi any) *SelectBuilder
OrWhereBetween is WhereBetween joined with OR.
Example:
conn.Select().From("orders").Where("status", "paid").OrWhereBetween("total", 500, 900)
// SELECT * FROM "orders" WHERE "status" = $1 OR "total" BETWEEN $2 AND $3
// args: [paid 500 900]
func (*SelectBuilder) OrWhereBetweenColumns ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereBetweenColumns(column string, c1 string, c2 string) *SelectBuilder
OrWhereBetweenColumns is WhereBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price").
OrWhereBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price" OR "cost"
// BETWEEN "low" AND "high"
func (*SelectBuilder) OrWhereColumn ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereColumn(first string, args ...any) *SelectBuilder
OrWhereColumn is WhereColumn joined with OR.
Example:
conn.Select().From("users").WhereColumn("first_name", "last_name").OrWhereColumn("a", "<>", "b")
// SELECT * FROM "users" WHERE "first_name" = "last_name" OR "a" <> "b"
func (*SelectBuilder) OrWhereDate ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereDate(column string, args ...any) *SelectBuilder
OrWhereDate is WhereDate joined with OR.
Example:
conn.Select().From("orders").WhereDate("created_at", "2024-01-15").
OrWhereDate("created_at", "2024-02-01")
// SELECT * FROM "orders" WHERE "created_at"::DATE = $1 OR "created_at"::DATE = $2
// args: [2024-01-15 2024-02-01]
func (*SelectBuilder) OrWhereDay ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereDay(column string, args ...any) *SelectBuilder
OrWhereDay is WhereDay joined with OR.
Example:
conn.Select().From("orders").WhereDay("created_at", 15).OrWhereDay("created_at", ">", 20)
// SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 OR EXTRACT(DAY FROM
// "created_at") > $2
// args: [15 20]
func (*SelectBuilder) OrWhereExists ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereExists(sub *SelectBuilder) *SelectBuilder
OrWhereExists is WhereExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*SelectBuilder) OrWhereGroup ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereGroup(fn func(*WhereClause)) *SelectBuilder
OrWhereGroup is WhereGroup joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").Where("age", ">", 30)
})
// SELECT * FROM "users" WHERE "active" = $1 OR ("role" = $2 AND "age" > $3)
// args: [true admin 30]
func (*SelectBuilder) OrWhereIn ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereIn(column string, values any) *SelectBuilder
OrWhereIn is WhereIn joined with OR.
Example:
conn.Select().From("users").WhereIn("role", []string{"ann", "bob"}).OrWhereIn("id", []int{9})
// SELECT * FROM "users" WHERE "role" IN ($1, $2) OR "id" IN ($3) args: [ann bob 9]
func (*SelectBuilder) OrWhereIntegerInRaw ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereIntegerInRaw(column string, values any) *SelectBuilder
OrWhereIntegerInRaw is WhereIntegerInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1}).
OrWhereIntegerInRaw("id", []int64{7, 8})
// SELECT * FROM "users" WHERE "id" IN (1) OR "id" IN (7, 8)
func (*SelectBuilder) OrWhereIntegerNotInRaw ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereIntegerNotInRaw(column string, values any) *SelectBuilder
OrWhereIntegerNotInRaw is WhereIntegerNotInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2}).
OrWhereIntegerNotInRaw("id", []int{3})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2) OR "id" NOT IN (3)
func (*SelectBuilder) OrWhereJsonContains ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereJsonContains(column string, value any) *SelectBuilder
OrWhereJsonContains is WhereJsonContains joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR ("options"->'tags')::JSONB @> $2
// args: [true "go"]
func (*SelectBuilder) OrWhereJsonContainsKey ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereJsonContainsKey(column string) *SelectBuilder
OrWhereJsonContainsKey is WhereJsonContainsKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*SelectBuilder) OrWhereJsonDoesntContain ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereJsonDoesntContain(column string, value any) *SelectBuilder
OrWhereJsonDoesntContain is WhereJsonDoesntContain joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("options"->'tags')::JSONB @> $2
// args: [true "php"]
func (*SelectBuilder) OrWhereJsonDoesntContainKey ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereJsonDoesntContainKey(column string) *SelectBuilder
OrWhereJsonDoesntContainKey is WhereJsonDoesntContainKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).
OrWhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1
// OR NOT COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*SelectBuilder) OrWhereJsonDoesntOverlap ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereJsonDoesntOverlap(column string, value any) *SelectBuilder
OrWhereJsonDoesntOverlap is WhereJsonDoesntOverlap joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["php"]]
func (*SelectBuilder) OrWhereJsonLength ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereJsonLength(column string, args ...any) *SelectBuilder
OrWhereJsonLength is WhereJsonLength joined with OR.
Example:
conn.Select().From("users").WhereJsonLength("options->tags", 0)
.OrWhereJsonLength("options->roles", ">=", 3).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// OR JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) >= $2 args: [0 3]
func (*SelectBuilder) OrWhereJsonOverlaps ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereJsonOverlaps(column string, value any) *SelectBuilder
OrWhereJsonOverlaps is WhereJsonOverlaps joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonOverlaps("options->tags", []string{"go"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["go"]]
func (*SelectBuilder) OrWhereLike ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereLike(column string, value any, caseSensitive ...bool) *SelectBuilder
OrWhereLike is WhereLike joined with OR.
Example:
conn.Select().From("users").WhereLike("name", "an%").OrWhereLike("name", "bo%")
// SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 OR "name"::TEXT ILIKE $2
// args: [an% bo%]
func (*SelectBuilder) OrWhereMap ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereMap(m map[string]any) *SelectBuilder
OrWhereMap is WhereMap joined with OR.
Example:
conn.Select().From("users").WhereMap(map[string]any{"a": 1}).OrWhereMap(map[string]any{"b": 2})
// SELECT * FROM "users" WHERE ("a" = $1) OR ("b" = $2) args: [1 2]
func (*SelectBuilder) OrWhereMonth ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereMonth(column string, args ...any) *SelectBuilder
OrWhereMonth is WhereMonth joined with OR.
Example:
conn.Select().From("orders").WhereMonth("created_at", ">=", 6).OrWhereMonth("created_at", 1)
// SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") >= $1 OR EXTRACT(MONTH FROM
// "created_at") = $2
// args: [06 01]
func (*SelectBuilder) OrWhereNone ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNone(columns []string, args ...any) *SelectBuilder
OrWhereNone is WhereNone joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereNone([]string{"a", "b"}, 0)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("a" = $2 OR "b" = $3)
// args: [true 0 0]
func (*SelectBuilder) OrWhereNot ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNot(column string, args ...any) *SelectBuilder
OrWhereNot adds "OR NOT <predicate>".
Example:
conn.Select().From("users").Where("age", ">", 18).OrWhereNot("status", "<", 3)
// SELECT * FROM "users" WHERE "age" > $1 OR NOT "status" < $2 args: [18 3]
func (*SelectBuilder) OrWhereNotBetween ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNotBetween(column string, lo any, hi any) *SelectBuilder
OrWhereNotBetween is WhereNotBetween joined with OR.
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100).OrWhereNotBetween("qty", 1, 5)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 OR "qty" NOT BETWEEN $3 AND $4
// args: [10 100 1 5]
func (*SelectBuilder) OrWhereNotBetweenColumns ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNotBetweenColumns(column string, c1 string, c2 string) *SelectBuilder
OrWhereNotBetweenColumns is WhereNotBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price").
OrWhereNotBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price" OR "cost"
// NOT BETWEEN "low" AND "high"
func (*SelectBuilder) OrWhereNotExists ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNotExists(sub *SelectBuilder) *SelectBuilder
OrWhereNotExists is WhereNotExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereNotExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*SelectBuilder) OrWhereNotIn ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNotIn(column string, values any) *SelectBuilder
OrWhereNotIn is WhereNotIn joined with OR.
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2}).OrWhereNotIn("role", []string{"ann"})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) OR "role" NOT IN ($3) args: [1 2 ann]
func (*SelectBuilder) OrWhereNotLike ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNotLike(column string, value any, caseSensitive ...bool) *SelectBuilder
OrWhereNotLike is WhereNotLike joined with OR.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%").OrWhereNotLike("name", "%demo%", true)
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 OR "name"::TEXT NOT LIKE $2
// args: [%test% %demo%]
func (*SelectBuilder) OrWhereNotNull ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNotNull(column string) *SelectBuilder
OrWhereNotNull is WhereNotNull joined with OR.
Example:
conn.Select().From("users").WhereNotNull("verified_at").OrWhereNotNull("invited_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL OR "invited_at" IS NOT NULL
func (*SelectBuilder) OrWhereNull ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNull(column string) *SelectBuilder
OrWhereNull is WhereNull joined with OR.
Example:
conn.Select().From("users").WhereNull("deleted_at").OrWhereNull("banned_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL OR "banned_at" IS NULL
func (*SelectBuilder) OrWhereNullSafeEquals ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereNullSafeEquals(column string, value any) *SelectBuilder
OrWhereNullSafeEquals is WhereNullSafeEquals joined with OR.
Example:
conn.Select().From("users").WhereNullSafeEquals("a", 1).OrWhereNullSafeEquals("b", 2)
// SELECT * FROM "users" WHERE "a" IS NOT DISTINCT FROM $1 OR "b" IS NOT DISTINCT FROM $2
// args: [1 2]
func (*SelectBuilder) OrWhereRaw ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereRaw(sql string, args ...any) *SelectBuilder
OrWhereRaw is WhereRaw joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereRaw("age between ? and ?", 18, 30)
// SELECT * FROM "users" WHERE "active" = $1 OR age between $2 and $3
// args: [true 18 30]
func (*SelectBuilder) OrWhereRowValues ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereRowValues(columns []string, op string, values []any) *SelectBuilder
OrWhereRowValues is WhereRowValues joined with OR.
Example:
conn.Select().From("events").Where("kind", "x").
OrWhereRowValues([]string{"a", "b"}, "=", []any{1, 2})
// SELECT * FROM "events" WHERE "kind" = $1 OR ("a", "b") = ($2, $3) args: [x 1 2]
func (*SelectBuilder) OrWhereTime ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereTime(column string, args ...any) *SelectBuilder
OrWhereTime is WhereTime joined with OR.
Example:
conn.Select().From("orders").WhereTime("created_at", "10:30:00").
OrWhereTime("created_at", "<", "08:00:00")
// SELECT * FROM "orders" WHERE "created_at"::TIME = $1 OR "created_at"::TIME < $2
// args: [10:30:00 08:00:00]
func (*SelectBuilder) OrWhereValueBetween ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereValueBetween(value any, c1 string, c2 string) *SelectBuilder
OrWhereValueBetween is WhereValueBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total").
OrWhereValueBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" OR $2 BETWEEN "a" AND
// "b"
// args: [50 7]
func (*SelectBuilder) OrWhereValueNotBetween ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereValueNotBetween(value any, c1 string, c2 string) *SelectBuilder
OrWhereValueNotBetween is WhereValueNotBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total").
OrWhereValueNotBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" OR $2 NOT BETWEEN
// "a" AND "b"
// args: [50 7]
func (*SelectBuilder) OrWhereYear ¶ added in v0.2.0
func (s *SelectBuilder) OrWhereYear(column string, args ...any) *SelectBuilder
OrWhereYear is WhereYear joined with OR.
Example:
conn.Select().From("orders").WhereYear("created_at", ">", 2020).OrWhereYear("created_at", 1999)
// SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") > $1 OR EXTRACT(YEAR FROM
// "created_at") = $2
// args: [2020 1999]
func (*SelectBuilder) OrderBy ¶ added in v0.2.0
func (s *SelectBuilder) OrderBy(column string, direction ...string) *SelectBuilder
OrderBy adds ORDER BY column; direction is "asc" (default) or "desc".
Example:
conn.Select().From("users").OrderBy("name").OrderBy("age", "desc")
// SELECT * FROM "users" ORDER BY "name" ASC, "age" DESC
func (*SelectBuilder) OrderByDesc ¶ added in v0.2.0
func (s *SelectBuilder) OrderByDesc(column string) *SelectBuilder
OrderByDesc is OrderBy(column, "desc").
Example:
conn.Select().From("users").OrderByDesc("created_at")
// SELECT * FROM "users" ORDER BY "created_at" DESC
func (*SelectBuilder) OrderByRaw ¶ added in v0.2.0
func (s *SelectBuilder) OrderByRaw(sql string, args ...any) *SelectBuilder
OrderByRaw adds a raw ORDER BY expression (caller-trusted SQL).
Example:
conn.Select().From("users").OrderByRaw("case when role = ? then 0 else 1 end", "admin")
// SELECT * FROM "users" ORDER BY case when role = $1 then 0 else 1 end
// args: [admin]
func (*SelectBuilder) Paginate ¶ added in v0.2.0
func (s *SelectBuilder) Paginate(ctx context.Context, page int, perPage int, dest any) (Page, error)
Paginate counts the rows, then scans the requested 1-based page into dest (a pointer to a slice). The count ignores order, limit and offset.
Example:
var users []User
p, err := conn.Select().From("users").OrderBy("id").Paginate(ctx, 2, 2, &users)
// SELECT COUNT(*) AS "aggregate" FROM "users"
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 2 OFFSET 2
// with 5 rows: p.Total = 5, p.LastPage = 3, p.From = 3, p.To = 4
func (*SelectBuilder) Pluck ¶ added in v0.2.0
Pluck scans one column of every row into dest, a pointer to a slice of scalars.
Example:
var names []string
err := conn.Select().From("users").OrderBy("id").Pluck(ctx, "name", &names)
// SELECT "name" FROM "users" ORDER BY "id" ASC
// names = ["ann", "bob"]
func (*SelectBuilder) PluckMap ¶ added in v0.2.0
PluckMap scans two columns into dest, a non-nil pointer to a map[K]V (key column -> value column).
Example:
var byID map[int64]string
err := conn.Select().From("users").PluckMap(ctx, "name", "id", &byID)
// SELECT "name", "id" FROM "users"
// byID = map[1:"ann" 2:"bob"]
func (*SelectBuilder) Prefix ¶ added in v0.2.0
func (s *SelectBuilder) Prefix(p string) *SelectBuilder
Prefix sets a table prefix applied to table names, aliases and qualified columns.
Example:
db.Use(db.Postgres).Select("u.id").From("users as u").Prefix("app_")
// SELECT "app_u"."id" FROM "app_users" AS "app_u"
func (*SelectBuilder) Reorder ¶ added in v0.2.0
func (s *SelectBuilder) Reorder() *SelectBuilder
Reorder removes all existing ORDER BY clauses (including a union's).
Example:
conn.Select().From("posts").OrderBy("title").Reorder()
// SELECT * FROM "posts"
func (*SelectBuilder) ReorderBy ¶ added in v0.2.0
func (s *SelectBuilder) ReorderBy(column string, direction ...string) *SelectBuilder
ReorderBy is Reorder followed by OrderBy(column, direction).
Example:
conn.Select().From("posts").OrderBy("title").ReorderBy("id", "desc")
// SELECT * FROM "posts" ORDER BY "id" DESC
func (*SelectBuilder) RightJoin ¶ added in v0.2.0
func (s *SelectBuilder) RightJoin(table string, first string, args ...any) *SelectBuilder
RightJoin adds a right join.
Example:
conn.Select().From("users as u").RightJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*SelectBuilder) RightJoinFunc ¶ added in v0.2.0
func (s *SelectBuilder) RightJoinFunc(table string, fn func(*JoinClause)) *SelectBuilder
RightJoinFunc adds a right join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").RightJoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.score", ">", 10)
})
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."score" > $1
// args: [10]
func (*SelectBuilder) RightJoinSub ¶ added in v0.2.0
func (s *SelectBuilder) RightJoinSub(sub *SelectBuilder, as string, first string, args ...any) *SelectBuilder
RightJoinSub joins a subquery with a right join.
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").RightJoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" RIGHT JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1)
// AS "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*SelectBuilder) RightJoinSubFunc ¶ added in v0.2.0
func (s *SelectBuilder) RightJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *SelectBuilder
RightJoinSubFunc is JoinSubFunc as a right join.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").RightJoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id")
})
// SELECT * FROM "users" AS "u" RIGHT JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id"
func (*SelectBuilder) RightJoinWhere ¶ added in v0.2.0
func (s *SelectBuilder) RightJoinWhere(table string, column string, args ...any) *SelectBuilder
RightJoinWhere is JoinWhere as a right join.
Example:
conn.Select().From("users as u").RightJoinWhere("posts as p", "p.status", "published")
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."status" = $1
// args: [published]
func (*SelectBuilder) Select ¶ added in v0.2.0
func (s *SelectBuilder) Select(columns ...string) *SelectBuilder
Select replaces the selected columns.
Example:
conn.Select().From("users as u").Select("u.id", "u.name as full_name")
// SELECT "u"."id", "u"."name" AS "full_name" FROM "users" AS "u"
func (*SelectBuilder) SelectRaw ¶ added in v0.2.0
func (s *SelectBuilder) SelectRaw(sql string, args ...any) *SelectBuilder
SelectRaw appends a raw select expression.
Example:
conn.Select().From("orders").Select("user_id").
SelectRaw("sum(amount) * ? as total", 1.1).GroupBy("user_id")
// SELECT "user_id", sum(amount) * $1 as total FROM "orders" GROUP BY "user_id"
// args: [1.1]
func (*SelectBuilder) SelectSub ¶ added in v0.2.0
func (s *SelectBuilder) SelectSub(sub *SelectBuilder, as string) *SelectBuilder
SelectSub appends "(subquery) as alias" to the select list. The subquery is snapshotted: later changes to sub do not affect this query.
Example:
n := conn.Select().From("posts").SelectRaw("count(*)").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Select("name").SelectSub(n, "post_count")
// SELECT "name", (SELECT count(*) FROM "posts" WHERE "posts"."user_id" = "users"."id") AS
// "post_count" FROM "users"
func (*SelectBuilder) SharedLock ¶ added in v0.2.0
func (s *SelectBuilder) SharedLock() *SelectBuilder
SharedLock adds "FOR SHARE" (Postgres) or "LOCK IN SHARE MODE" (MySQL); ignored on SQLite.
Example:
conn.Select().From("accounts").Where("id", 1).SharedLock()
// Postgres: SELECT * FROM "accounts" WHERE "id" = $1 FOR SHARE args: [1]
// MySQL: SELECT * FROM `accounts` WHERE `id` = ? LOCK IN SHARE MODE args: [1]
func (*SelectBuilder) SimplePaginate ¶ added in v0.2.0
func (s *SelectBuilder) SimplePaginate(ctx context.Context, page int, perPage int, dest any) (SimplePage, error)
SimplePaginate fetches one extra row to learn whether another page exists, skipping the count query.
Example:
var users []User
p, err := conn.Select().From("users").OrderBy("id").SimplePaginate(ctx, 1, 2, &users)
// SELECT * FROM "users" ORDER BY "id" ASC LIMIT 3 OFFSET 0
// users holds at most 2 rows; p.HasMore = true when a third came back
func (*SelectBuilder) Skip ¶ added in v0.2.0
func (s *SelectBuilder) Skip(n int) *SelectBuilder
Skip is an alias of Offset.
Example:
conn.Select().From("users").Take(10).Skip(5)
// SELECT * FROM "users" LIMIT 10 OFFSET 5
func (*SelectBuilder) Sole ¶ added in v0.2.0
func (s *SelectBuilder) Sole(ctx context.Context, dest any) error
Sole returns the only matching row: ErrNotFound for none, ErrMultipleRecords for several.
Example:
var u User
err := conn.Select().From("users").Where("name", "ann").Sole(ctx, &u)
// SELECT * FROM "users" WHERE "name" = $1 LIMIT 2 args: ["ann"]
// two or more rows: err is db.ErrMultipleRecords
func (*SelectBuilder) StraightJoin ¶ added in v0.2.0
func (s *SelectBuilder) StraightJoin(table string, first string, args ...any) *SelectBuilder
StraightJoin adds a MySQL "straight_join"; other dialects error at compile time.
Example:
connMy.Select().From("users as u").StraightJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM `users` AS `u` STRAIGHT_JOIN `posts` AS `p` ON `p`.`user_id` = `u`.`id`
// connMy is db.Use(db.MySQL); other dialects return ErrUnsupported
func (*SelectBuilder) Sum ¶ added in v0.2.0
Sum returns sum(column) as float64 (0 when there are no rows).
Example:
sum, err := conn.Select().From("orders").Sum(ctx, "total")
// SELECT SUM("total") AS "aggregate" FROM "orders"
// sum = 250.5
func (*SelectBuilder) Take ¶ added in v0.2.0
func (s *SelectBuilder) Take(n int) *SelectBuilder
Take is an alias of Limit.
Example:
conn.Select().From("users").Take(5)
// SELECT * FROM "users" LIMIT 5
func (*SelectBuilder) Tap ¶ added in v0.2.0
func (s *SelectBuilder) Tap(fn func(*SelectBuilder)) *SelectBuilder
Tap runs fn for side effects and returns the builder.
Example:
conn.Select().From("users").Tap(func(q *db.SelectBuilder) { q.Where("id", 1) })
// SELECT * FROM "users" WHERE "id" = $1
func (*SelectBuilder) ToRawSQL ¶ added in v0.2.0
func (s *SelectBuilder) ToRawSQL() (string, error)
ToRawSQL compiles and interpolates args into the SQL. DEBUG ONLY: the result is not injection-safe. Never execute or log it in production.
Example:
sql, err := conn.Select().From("users").Where("id", 42).Where("name", "ann").ToRawSQL()
// sql: SELECT * FROM "users" WHERE "id" = 42 AND "name" = 'ann'
// DEBUG ONLY: not injection-safe
func (*SelectBuilder) ToSQL ¶ added in v0.2.0
func (s *SelectBuilder) ToSQL() (string, []any, error)
ToSQL compiles a SELECT into SQL text and its ordered bind arguments.
Example:
sql, args, err := conn.Select().From("users").Where("age", ">", 18).Limit(10).ToSQL()
// SELECT * FROM "users" WHERE "age" > $1 LIMIT 10
// args: [18]
func (*SelectBuilder) Union ¶ added in v0.2.0
func (s *SelectBuilder) Union(q *SelectBuilder) *SelectBuilder
Union appends "UNION (query)". After a union, OrderBy/Limit/Offset apply to the combined result. On SQLite members are wrapped as "SELECT * FROM (...)".
Example:
a := conn.Select().From("users").Select("name").Where("active", true)
b := conn.Select().From("admins").Select("name")
a.Union(b).OrderBy("name").Limit(10)
// (SELECT "name" FROM "users" WHERE "active" = $1) UNION (SELECT "name" FROM "admins") ORDER
// BY "name" ASC LIMIT 10
// args: [true]
func (*SelectBuilder) UnionAll ¶ added in v0.2.0
func (s *SelectBuilder) UnionAll(q *SelectBuilder) *SelectBuilder
UnionAll appends "UNION ALL (query)".
Example:
a := conn.Select().From("users").Select("name").Where("active", true)
b := conn.Select().From("admins").Select("name")
a.UnionAll(b).OrderBy("name").Limit(10)
// (SELECT "name" FROM "users" WHERE "active" = $1) UNION ALL (SELECT "name" FROM "admins")
// ORDER BY "name" ASC LIMIT 10
// args: [true]
func (*SelectBuilder) Unless ¶ added in v0.2.0
func (s *SelectBuilder) Unless(cond bool, fn func(*SelectBuilder)) *SelectBuilder
Unless applies fn when cond is false.
Example:
conn.Select().From("users").Unless(includeBanned, func(q *db.SelectBuilder) {
q.Where("banned", false)
})
// includeBanned == false: SELECT * FROM "users" WHERE "banned" = $1
func (*SelectBuilder) UseIndex ¶ added in v0.2.0
func (s *SelectBuilder) UseIndex(index string) *SelectBuilder
UseIndex adds "USE INDEX (a, b)" (MySQL; ignored on Postgres and SQLite). Index names are emitted unquoted and validated against [a-zA-Z0-9_$].
Example:
conn.Select().From("users").UseIndex("idx_email").Where("active", true)
// SELECT * FROM `users` USE INDEX (idx_email) WHERE `active` = ? args: [true]
func (*SelectBuilder) Value ¶ added in v0.2.0
Value scans a single column of the first row into dest (a pointer to a scalar).
Example:
var name string
err := conn.Select().From("users").Where("id", 1).Value(ctx, "name", &name)
// SELECT "name" FROM "users" WHERE "id" = $1 LIMIT 1 args: [1]
// name = "ann"
func (*SelectBuilder) When ¶ added in v0.2.0
func (s *SelectBuilder) When(cond bool, fn func(*SelectBuilder)) *SelectBuilder
When applies fn when cond is true.
Example:
conn.Select().From("users").When(onlyActive, func(q *db.SelectBuilder) {
q.Where("active", true)
})
// onlyActive == true: SELECT * FROM "users" WHERE "active" = $1
func (*SelectBuilder) Where ¶ added in v0.2.0
func (s *SelectBuilder) Where(column string, args ...any) *SelectBuilder
Where adds an AND predicate. Forms: Where(col, value) means "="; Where(col, op, value). A nil value with "=" / "!=" / "<>" becomes IS [NOT] NULL.
Example:
conn.Select().From("users").Where("active", true).Where("age", ">=", 18)
// SELECT * FROM "users" WHERE "active" = $1 AND "age" >= $2
// args: [true 18]
func (*SelectBuilder) WhereAll ¶ added in v0.2.0
func (s *SelectBuilder) WhereAll(columns []string, args ...any) *SelectBuilder
WhereAll requires the predicate to hold for every column: (a = ? and b = ?).
Example:
conn.Select().From("users").WhereAll([]string{"first_name", "last_name"}, "like", "an%")
// SELECT * FROM "users" WHERE ("first_name"::TEXT LIKE $1 AND "last_name"::TEXT LIKE $2)
// args: [an% an%]
func (*SelectBuilder) WhereAny ¶ added in v0.2.0
func (s *SelectBuilder) WhereAny(columns []string, args ...any) *SelectBuilder
WhereAny requires the predicate to hold for at least one column: (a = ? or b = ?).
Example:
conn.Select().From("users").WhereAny([]string{"first_name", "last_name"}, "ann")
// SELECT * FROM "users" WHERE ("first_name" = $1 OR "last_name" = $2) args: [ann ann]
func (*SelectBuilder) WhereBetween ¶ added in v0.2.0
func (s *SelectBuilder) WhereBetween(column string, lo any, hi any) *SelectBuilder
WhereBetween adds "col BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" BETWEEN $1 AND $2 args: [10 100]
func (*SelectBuilder) WhereBetweenColumns ¶ added in v0.2.0
func (s *SelectBuilder) WhereBetweenColumns(column string, c1 string, c2 string) *SelectBuilder
WhereBetweenColumns adds "col BETWEEN c1 AND c2" comparing against columns.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price"
func (*SelectBuilder) WhereColumn ¶ added in v0.2.0
func (s *SelectBuilder) WhereColumn(first string, args ...any) *SelectBuilder
WhereColumn compares two columns: WhereColumn(a, b) means "=", or WhereColumn(a, op, b).
Example:
conn.Select().From("users").WhereColumn("updated_at", ">", "created_at")
// SELECT * FROM "users" WHERE "updated_at" > "created_at"
func (*SelectBuilder) WhereDate ¶ added in v0.2.0
func (s *SelectBuilder) WhereDate(column string, args ...any) *SelectBuilder
WhereDate compares the date part of a column.
Example:
conn.Select().From("orders").WhereDate("created_at", ">=", "2024-01-15")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::DATE >= $1 args: [2024-01-15]
// MySQL: SELECT * FROM `orders` WHERE DATE(`created_at`) >= ? args: [2024-01-15]
// SQLite: SELECT * FROM "orders" WHERE STRFTIME('%Y-%m-%d', "created_at") >= CAST(? AS TEXT)
// args: [2024-01-15]
func (*SelectBuilder) WhereDay ¶ added in v0.2.0
func (s *SelectBuilder) WhereDay(column string, args ...any) *SelectBuilder
WhereDay compares the day-of-month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereDay("created_at", 15)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 args: [15]
// MySQL: SELECT * FROM `orders` WHERE DAY(`created_at`) = ? args: [15]
func (*SelectBuilder) WhereExists ¶ added in v0.2.0
func (s *SelectBuilder) WhereExists(sub *SelectBuilder) *SelectBuilder
WhereExists adds "EXISTS (subquery)". Build sub with DB.Select.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereExists(posts)
// SELECT * FROM "users" WHERE EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*SelectBuilder) WhereGroup ¶ added in v0.2.0
func (s *SelectBuilder) WhereGroup(fn func(*WhereClause)) *SelectBuilder
WhereGroup wraps the predicates added inside fn in parentheses. fn receives a fresh WhereClause; only its Where* calls are used.
Example:
conn.Select().From("users").Where("active", true).WhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").OrWhere("role", "editor")
})
// SELECT * FROM "users" WHERE "active" = $1 AND ("role" = $2 OR "role" = $3)
// args: [true admin editor]
func (*SelectBuilder) WhereIn ¶ added in v0.2.0
func (s *SelectBuilder) WhereIn(column string, values any) *SelectBuilder
WhereIn adds "col IN (...)". values may be any slice, a scalar, or a *SelectBuilder subquery. An empty list compiles to the always-false "0 = 1".
Example:
conn.Select().From("users").WhereIn("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN ($1, $2, $3) args: [1 2 3]
func (*SelectBuilder) WhereIntegerInRaw ¶ added in v0.2.0
func (s *SelectBuilder) WhereIntegerInRaw(column string, values any) *SelectBuilder
WhereIntegerInRaw inlines integers (no bind args); non-integers record an error. Useful for very large ID lists that would exceed driver parameter limits.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN (1, 2, 3)
func (*SelectBuilder) WhereIntegerNotInRaw ¶ added in v0.2.0
func (s *SelectBuilder) WhereIntegerNotInRaw(column string, values any) *SelectBuilder
WhereIntegerNotInRaw is the negated WhereIntegerInRaw.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2)
func (*SelectBuilder) WhereJsonContains ¶ added in v0.2.0
func (s *SelectBuilder) WhereJsonContains(column string, value any) *SelectBuilder
WhereJsonContains adds a JSON containment test on a column or "col->path". MySQL json_contains, Postgres @> (jsonb), SQLite json_each membership.
Example:
conn.Select().From("users").WhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE ("options"->'tags')::JSONB @> $1 args: ["go"]
func (*SelectBuilder) WhereJsonContainsKey ¶ added in v0.2.0
func (s *SelectBuilder) WhereJsonContainsKey(column string) *SelectBuilder
WhereJsonContainsKey tests that the JSON path "col->key" exists.
Example:
conn.Select().From("users").WhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
// MySQL: SELECT * FROM `users`
// WHERE IFNULL(JSON_CONTAINS_PATH(`options`, 'one', '$."theme"'), 0)
func (*SelectBuilder) WhereJsonDoesntContain ¶ added in v0.2.0
func (s *SelectBuilder) WhereJsonDoesntContain(column string, value any) *SelectBuilder
WhereJsonDoesntContain negates WhereJsonContains.
Example:
conn.Select().From("users").WhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE NOT ("options"->'tags')::JSONB @> $1 args: ["php"]
func (*SelectBuilder) WhereJsonDoesntContainKey ¶ added in v0.2.0
func (s *SelectBuilder) WhereJsonDoesntContainKey(column string) *SelectBuilder
WhereJsonDoesntContainKey negates WhereJsonContainsKey.
Example:
conn.Select().From("users").WhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE NOT COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
func (*SelectBuilder) WhereJsonDoesntOverlap ¶ added in v0.2.0
func (s *SelectBuilder) WhereJsonDoesntOverlap(column string, value any) *SelectBuilder
WhereJsonDoesntOverlap negates WhereJsonOverlaps.
Example:
conn.Select().From("users")
.WhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["php"]]
func (*SelectBuilder) WhereJsonLength ¶ added in v0.2.0
func (s *SelectBuilder) WhereJsonLength(column string, args ...any) *SelectBuilder
WhereJsonLength compares the length of a JSON array: (value) or (operator, value).
Example:
conn.Select().From("users")
.WhereJsonLength("options->tags", 2).WhereJsonLength("options->roles", ">", 1).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// AND JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) > $2 args: [2 1]
func (*SelectBuilder) WhereJsonOverlaps ¶ added in v0.2.0
func (s *SelectBuilder) WhereJsonOverlaps(column string, value any) *SelectBuilder
WhereJsonOverlaps adds json_overlaps (MySQL only; other dialects error at compile time).
Example:
conn.Select().From("users")
.WhereJsonOverlaps("options->tags", []string{"go", "sql"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["go","sql"]]
func (*SelectBuilder) WhereLike ¶ added in v0.2.0
func (s *SelectBuilder) WhereLike(column string, value any, caseSensitive ...bool) *SelectBuilder
WhereLike adds a LIKE predicate, case-insensitive unless caseSensitive[0] is true. Postgres: ILIKE/LIKE. MySQL: LIKE/LIKE BINARY. SQLite: LIKE/GLOB (pattern converted).
Example:
conn.Select().From("users").WhereLike("name", "An%")
// Postgres: SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 args: [An%]
// MySQL: SELECT * FROM `users` WHERE `name` LIKE ? args: [An%]
// SQLite: SELECT * FROM "users" WHERE "name" LIKE ? args: [An%]
func (*SelectBuilder) WhereMap ¶ added in v0.2.0
func (s *SelectBuilder) WhereMap(m map[string]any) *SelectBuilder
WhereMap adds one grouped "a = ? and b = ?" predicate; keys are sorted for stable SQL.
Example:
conn.Select().From("users").WhereMap(map[string]any{"role": "ann", "active": true})
// SELECT * FROM "users" WHERE ("active" = $1 AND "role" = $2) args: [true ann]
func (*SelectBuilder) WhereMonth ¶ added in v0.2.0
func (s *SelectBuilder) WhereMonth(column string, args ...any) *SelectBuilder
WhereMonth compares the month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereMonth("created_at", 3)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") = $1 args: [03]
// MySQL: SELECT * FROM `orders` WHERE MONTH(`created_at`) = ? args: [03]
func (*SelectBuilder) WhereNone ¶ added in v0.2.0
func (s *SelectBuilder) WhereNone(columns []string, args ...any) *SelectBuilder
WhereNone requires the predicate to hold for no column: not (a = ? or b = ?).
Example:
conn.Select().From("users").WhereNone([]string{"first_name", "last_name"}, "like", "%test%")
// SELECT * FROM "users" WHERE NOT ("first_name"::TEXT LIKE $1 OR "last_name"::TEXT LIKE $2)
// args: [%test% %test%]
func (*SelectBuilder) WhereNot ¶ added in v0.2.0
func (s *SelectBuilder) WhereNot(column string, args ...any) *SelectBuilder
WhereNot adds "AND NOT <predicate>".
Example:
conn.Select().From("users").WhereNot("role", "admin")
// SELECT * FROM "users" WHERE NOT "role" = $1 args: [admin]
func (*SelectBuilder) WhereNotBetween ¶ added in v0.2.0
func (s *SelectBuilder) WhereNotBetween(column string, lo any, hi any) *SelectBuilder
WhereNotBetween adds "col NOT BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 args: [10 100]
func (*SelectBuilder) WhereNotBetweenColumns ¶ added in v0.2.0
func (s *SelectBuilder) WhereNotBetweenColumns(column string, c1 string, c2 string) *SelectBuilder
WhereNotBetweenColumns is the negated WhereBetweenColumns.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price"
func (*SelectBuilder) WhereNotExists ¶ added in v0.2.0
func (s *SelectBuilder) WhereNotExists(sub *SelectBuilder) *SelectBuilder
WhereNotExists adds "NOT EXISTS (subquery)".
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereNotExists(posts)
// SELECT * FROM "users" WHERE NOT EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*SelectBuilder) WhereNotIn ¶ added in v0.2.0
func (s *SelectBuilder) WhereNotIn(column string, values any) *SelectBuilder
WhereNotIn adds "col NOT IN (...)". An empty list compiles to "1 = 1".
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) args: [1 2]
func (*SelectBuilder) WhereNotLike ¶ added in v0.2.0
func (s *SelectBuilder) WhereNotLike(column string, value any, caseSensitive ...bool) *SelectBuilder
WhereNotLike is the negated WhereLike.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%")
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 args: [%test%]
func (*SelectBuilder) WhereNotNull ¶ added in v0.2.0
func (s *SelectBuilder) WhereNotNull(column string) *SelectBuilder
WhereNotNull adds "col IS NOT NULL".
Example:
conn.Select().From("users").WhereNotNull("verified_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL
func (*SelectBuilder) WhereNull ¶ added in v0.2.0
func (s *SelectBuilder) WhereNull(column string) *SelectBuilder
WhereNull adds "col IS NULL".
Example:
conn.Select().From("users").WhereNull("deleted_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL
func (*SelectBuilder) WhereNullSafeEquals ¶ added in v0.2.0
func (s *SelectBuilder) WhereNullSafeEquals(column string, value any) *SelectBuilder
WhereNullSafeEquals compares with NULL-safe equality (<=>, IS NOT DISTINCT FROM, IS).
Example:
conn.Select().From("users").WhereNullSafeEquals("manager_id", 7)
// Postgres: SELECT * FROM "users" WHERE "manager_id" IS NOT DISTINCT FROM $1 args: [7]
// MySQL: SELECT * FROM `users` WHERE `manager_id` <=> ? args: [7]
func (*SelectBuilder) WhereRaw ¶ added in v0.2.0
func (s *SelectBuilder) WhereRaw(sql string, args ...any) *SelectBuilder
WhereRaw adds a raw predicate (caller-trusted SQL).
Example:
conn.Select().From("users").WhereRaw("lower(name) = ?", "ann")
// SELECT * FROM "users" WHERE lower(name) = $1
// args: [ann]
func (*SelectBuilder) WhereRowValues ¶ added in v0.2.0
func (s *SelectBuilder) WhereRowValues(columns []string, op string, values []any) *SelectBuilder
WhereRowValues adds "(a, b) op (?, ?)".
Example:
conn.Select().From("events").
WhereRowValues([]string{"created_at", "id"}, ">", []any{"2024-01-15", 42})
// SELECT * FROM "events" WHERE ("created_at", "id") > ($1, $2) args: [2024-01-15 42]
func (*SelectBuilder) WhereTime ¶ added in v0.2.0
func (s *SelectBuilder) WhereTime(column string, args ...any) *SelectBuilder
WhereTime compares the time part of a column.
Example:
conn.Select().From("orders").WhereTime("created_at", ">", "10:30:00")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::TIME > $1 args: [10:30:00]
// MySQL: SELECT * FROM `orders` WHERE TIME(`created_at`) > ? args: [10:30:00]
func (*SelectBuilder) WhereValueBetween ¶ added in v0.2.0
func (s *SelectBuilder) WhereValueBetween(value any, c1 string, c2 string) *SelectBuilder
WhereValueBetween adds "? BETWEEN c1 AND c2" (a value between two columns).
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" args: [50]
func (*SelectBuilder) WhereValueNotBetween ¶ added in v0.2.0
func (s *SelectBuilder) WhereValueNotBetween(value any, c1 string, c2 string) *SelectBuilder
WhereValueNotBetween is the negated WhereValueBetween.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" args: [50]
func (*SelectBuilder) WhereYear ¶ added in v0.2.0
func (s *SelectBuilder) WhereYear(column string, args ...any) *SelectBuilder
WhereYear compares the year of a column.
Example:
conn.Select().From("orders").WhereYear("created_at", 2024)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") = $1
// args: [2024]
// MySQL: SELECT * FROM `orders` WHERE YEAR(`created_at`) = ? args: [2024]
func (*SelectBuilder) With ¶ added in v0.2.0
func (s *SelectBuilder) With(name string, q *SelectBuilder, opts ...CTEOption) *SelectBuilder
With adds a common table expression: "with name as (q)". The name is a table reference, so the table prefix applies to it as it does to From. The subquery is snapshotted: later changes to q do not affect this query. Options name the columns (CTEColumns) or hint materialization (CTEMaterialized, CTENotMaterialized).
On a select, a CTE can feed the query, a subquery, a union member, Count, Exists and Paginate. On an update or delete it is written before the verb (PostgreSQL, MySQL 8, SQLite; MariaDB returns ErrUnsupported). On an insert it is moved into the SELECT given to Using, so it needs Using.
Example:
active := conn.Select().From("users").Where("active", true)
conn.Select().From("active_users").With("active_users", active)
// WITH "active_users" AS (SELECT * FROM "users" WHERE "active" = $1) SELECT * FROM
// "active_users"
// args: [true]
func (*SelectBuilder) WithRaw ¶ added in v0.2.0
func (s *SelectBuilder) WithRaw(name string, e Expression, opts ...CTEOption) *SelectBuilder
WithRaw adds a common table expression whose body is a raw SQL fragment (caller-trusted SQL), e.g. db.Raw("values (?), (?)", 1, 2). It takes the same options as With.
Example:
conn.Select().From("ids").WithRaw("ids", db.Raw("values (?), (?)", 1, 2), db.CTEColumns("id"))
// WITH "ids" ("id") AS (values ($1), ($2)) SELECT * FROM "ids"
// args: [1 2]
func (*SelectBuilder) WithRecursive ¶ added in v0.2.0
func (s *SelectBuilder) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *SelectBuilder
WithRecursive adds a recursive common table expression and switches the clause to "with recursive". anchor is the starting query and step the recursive member that refers to name; they are joined with UNION ALL (CTEUnionDistinct for UNION) and written without parentheses, because SQLite rejects a recursive reference inside a subquery. Neither query is modified, and anchor must not have unions.
Example:
anchor := conn.Select().From("categories").Where("parent_id", nil)
step := conn.Select().From("categories as c").Join("tree as t", "c.parent_id", "t.id")
conn.Select().From("tree").WithRecursive("tree", anchor, step)
// WITH RECURSIVE "tree" AS (SELECT * FROM "categories" WHERE "parent_id" IS NULL UNION ALL
// SELECT * FROM "categories" AS "c" INNER JOIN "tree" AS "t" ON "c"."parent_id" =
// "t"."id") SELECT * FROM "tree"
type SimplePage ¶
SimplePage is a pagination without a total count.
Example:
var users []User
p, err := conn.Select().From("users").OrderBy("id").SimplePaginate(ctx, 1, 2, &users)
// p.PerPage = 2, p.CurrentPage = 1, p.HasMore = true when a third row exists
type SimplePaged ¶
type SimplePaged[T any] struct { SimplePage Items []T }
SimplePaged is a count-free page with its rows.
type Tabler ¶
type Tabler interface{ TableName() string }
Tabler is implemented by row types that know their table, which lets From[T] work without a table name:
func (User) TableName() string { return "users" }
Either receiver kind works, and the method is promoted through embedding.
The method is called on a zero value, once per type: the result is cached, so a name that changes later is not picked up. A method that panics on a zero value (for example by dereferencing a nil embedded pointer) is reported as ErrInvalidArgs instead. For per-tenant or per-period tables, give the name explicitly with As[T](conn.Select().From(name)).
type UpdateBuilder ¶ added in v0.2.0
type UpdateBuilder struct {
// contains filtered or unexported fields
}
UpdateBuilder is a mutable UPDATE statement. Start one with DB.Update, add assignments with Set/SetMap/SetRow/Increment/Decrement, narrow it with Where, and finish with Exec, Get or ToSQL. Without a WHERE or LIMIT it refuses to build (ErrNoWhere) unless AllRows was called. Not safe for concurrent use.
func (*UpdateBuilder) AllRows ¶ added in v0.2.0
func (u *UpdateBuilder) AllRows() *UpdateBuilder
AllRows confirms that an update/delete without a where clause is intended. Without it, an UpdateBuilder or DeleteBuilder refuses to build (ErrNoWhere).
Example:
conn.Delete("sessions").AllRows().ToSQL()
// DELETE FROM "sessions" args: []
func (*UpdateBuilder) Clone ¶ added in v0.2.0
func (u *UpdateBuilder) Clone() *UpdateBuilder
Clone returns an independent copy. Cloning a nil *UpdateBuilder returns nil.
Example:
base := conn.Update("users").Set("active", false)
one := base.Clone().Where("id", 1)
func (*UpdateBuilder) CrossJoin ¶ added in v0.2.0
func (u *UpdateBuilder) CrossJoin(table string) *UpdateBuilder
CrossJoin adds "CROSS JOIN table".
Example:
conn.Select().From("users").CrossJoin("roles")
// SELECT * FROM "users" CROSS JOIN "roles"
func (*UpdateBuilder) CrossJoinSub ¶ added in v0.2.0
func (u *UpdateBuilder) CrossJoinSub(sub *SelectBuilder, as string) *UpdateBuilder
CrossJoinSub cross joins a subquery.
Example:
sub := conn.Select().From("roles").Select("name").Where("active", true)
conn.Select().From("users").CrossJoinSub(sub, "r")
// SELECT * FROM "users" CROSS JOIN (SELECT "name" FROM "roles" WHERE "active" = $1) AS "r"
// args: [true]
func (*UpdateBuilder) Decrement ¶ added in v0.2.0
func (u *UpdateBuilder) Decrement(column string, amount any) *UpdateBuilder
Decrement sets column = column - amount.
Example:
conn.Update("products").Decrement("stock", 2).Where("id", 3)
// UPDATE "products" SET "stock" = "stock" - $1 WHERE "id" = $2 args: [2 3]
func (*UpdateBuilder) DecrementEach ¶ added in v0.2.0
func (u *UpdateBuilder) DecrementEach(amounts map[string]any) *UpdateBuilder
DecrementEach decrements several columns at once.
Example:
conn.Update("stats").DecrementEach(map[string]any{"views": 5, "clicks": 1}).Where("day", "2026-01-01")
// UPDATE "stats" SET "clicks" = "clicks" - $1, "views" = "views" - $2 WHERE "day" = $3
// args: [1 5 2026-01-01]
func (*UpdateBuilder) Err ¶ added in v0.2.0
func (u *UpdateBuilder) Err() error
Err returns the first error recorded while building.
Example:
q := conn.Select().From("users").Where("id", "!!", 1)
err := q.Err()
// err: quill: invalid operator: "!!"
func (*UpdateBuilder) Exec ¶ added in v0.2.0
func (u *UpdateBuilder) Exec(ctx context.Context) (int64, error)
Exec runs the update and returns the rows affected.
Example:
n, err := conn.Update("users").Set("name", "Ann").Where("id", 7).Exec(ctx)
// UPDATE "users" SET "name" = $1 WHERE "id" = $2 args: [Ann 7]
func (*UpdateBuilder) FromJoins ¶ added in v0.2.0
func (u *UpdateBuilder) FromJoins() *UpdateBuilder
FromJoins switches to the Postgres "UPDATE t SET ... FROM j1, j2 WHERE ..." form, where each Join's ON conditions become part of the WHERE. Other dialects return ErrUnsupported (MySQL supports Join directly).
Example:
conn.Update("posts").Join("users", "users.id", "=", "posts.user_id").FromJoins().
Set("hidden", true).Where("users.banned", true)
// UPDATE "posts" SET "hidden" = $1 FROM "users"
// WHERE "users"."banned" = $2 AND "users"."id" = "posts"."user_id" args: [true true]
func (*UpdateBuilder) Get ¶ added in v0.2.0
func (u *UpdateBuilder) Get(ctx context.Context, dest any) error
Get runs the update and scans the RETURNING rows into dest. Call Returning first.
Example:
var rows []User
err := conn.Update("users").Set("name", "Ann").Where("id", 7).Returning("*").Get(ctx, &rows)
// UPDATE "users" SET "name" = $1 WHERE "id" = $2 RETURNING * args: [Ann 7]
func (*UpdateBuilder) InRandomOrder ¶ added in v0.2.0
func (u *UpdateBuilder) InRandomOrder(seed ...int) *UpdateBuilder
InRandomOrder orders randomly: RANDOM() on Postgres/SQLite, RAND([seed]) on MySQL.
Example:
conn.Select().From("posts").InRandomOrder().Limit(5)
// Postgres: SELECT * FROM "posts" ORDER BY RANDOM() LIMIT 5
// MySQL: SELECT * FROM `posts` ORDER BY RAND() LIMIT 5
func (*UpdateBuilder) Increment ¶ added in v0.2.0
func (u *UpdateBuilder) Increment(column string, amount any) *UpdateBuilder
Increment sets column = column + amount.
Example:
conn.Update("posts").Increment("views", 1).Set("seen_by", "ann").Where("id", 7)
// UPDATE "posts" SET "views" = "views" + $1, "seen_by" = $2 WHERE "id" = $3 args: [1 ann 7]
func (*UpdateBuilder) IncrementEach ¶ added in v0.2.0
func (u *UpdateBuilder) IncrementEach(amounts map[string]any) *UpdateBuilder
IncrementEach increments several columns at once; amounts maps column to amount.
Example:
conn.Update("stats").IncrementEach(map[string]any{"views": 5, "clicks": 1}).Where("day", "2026-01-01")
// UPDATE "stats" SET "clicks" = "clicks" + $1, "views" = "views" + $2 WHERE "day" = $3
// args: [1 5 2026-01-01]
func (*UpdateBuilder) Join ¶ added in v0.2.0
func (u *UpdateBuilder) Join(table string, first string, args ...any) *UpdateBuilder
Join adds "INNER JOIN table ON first = second" (or "first op second").
Example:
conn.Select().From("users as u").Join("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*UpdateBuilder) JoinFunc ¶ added in v0.2.0
func (u *UpdateBuilder) JoinFunc(table string, fn func(*JoinClause)) *UpdateBuilder
JoinFunc adds an inner join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").JoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.published", true)
})
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."published" = $1
// args: [true]
func (*UpdateBuilder) JoinLateral ¶ added in v0.2.0
func (u *UpdateBuilder) JoinLateral(sub *SelectBuilder, as string) *UpdateBuilder
JoinLateral adds "INNER JOIN LATERAL (subquery) AS alias ON TRUE" (Postgres, MySQL >= 8.0.14).
Example:
recent := conn.Select().From("posts").Select("id", "title").
WhereColumn("posts.user_id", "u.id").Limit(1)
conn.Select().From("users as u").JoinLateral(recent, "rp")
// SELECT * FROM "users" AS "u" INNER JOIN LATERAL (SELECT "id", "title" FROM "posts" WHERE
// "posts"."user_id" = "u"."id" LIMIT 1) AS "rp" ON TRUE
// MariaDB returns ErrUnsupported
func (*UpdateBuilder) JoinSub ¶ added in v0.2.0
func (u *UpdateBuilder) JoinSub(sub *SelectBuilder, as string, first string, args ...any) *UpdateBuilder
JoinSub joins a subquery: "INNER JOIN (SELECT ...) AS alias ON ...".
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").JoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" INNER JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1)
// AS "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*UpdateBuilder) JoinSubFunc ¶ added in v0.2.0
func (u *UpdateBuilder) JoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *UpdateBuilder
JoinSubFunc joins a subquery with a complex ON clause built in fn.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").JoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.score", ">", 10)
})
// SELECT * FROM "users" AS "u" INNER JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id" AND "p"."score" > $1
// args: [10]
func (*UpdateBuilder) JoinWhere ¶ added in v0.2.0
func (u *UpdateBuilder) JoinWhere(table string, column string, args ...any) *UpdateBuilder
JoinWhere joins on a bound value: "INNER JOIN t ON col = ?".
Example:
conn.Select().From("users as u").JoinWhere("posts as p", "p.status", "published")
// SELECT * FROM "users" AS "u" INNER JOIN "posts" AS "p" ON "p"."status" = $1
// args: [published]
func (*UpdateBuilder) Latest ¶ added in v0.2.0
func (u *UpdateBuilder) Latest(column ...string) *UpdateBuilder
Latest orders by column descending (default "created_at").
Example:
conn.Select().From("posts").Latest("published_at")
// SELECT * FROM "posts" ORDER BY "published_at" DESC
func (*UpdateBuilder) LeftJoin ¶ added in v0.2.0
func (u *UpdateBuilder) LeftJoin(table string, first string, args ...any) *UpdateBuilder
LeftJoin adds a left join.
Example:
conn.Select().From("users as u").LeftJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*UpdateBuilder) LeftJoinFunc ¶ added in v0.2.0
func (u *UpdateBuilder) LeftJoinFunc(table string, fn func(*JoinClause)) *UpdateBuilder
LeftJoinFunc adds a left join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").LeftJoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNull("p.deleted_at")
})
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."deleted_at" IS NULL
func (*UpdateBuilder) LeftJoinLateral ¶ added in v0.2.0
func (u *UpdateBuilder) LeftJoinLateral(sub *SelectBuilder, as string) *UpdateBuilder
LeftJoinLateral is JoinLateral as a left join.
Example:
recent := conn.Select().From("posts").Select("id", "title").
WhereColumn("posts.user_id", "u.id").Limit(1)
conn.Select().From("users as u").LeftJoinLateral(recent, "rp")
// SELECT * FROM "users" AS "u" LEFT JOIN LATERAL (SELECT "id", "title" FROM "posts" WHERE
// "posts"."user_id" = "u"."id" LIMIT 1) AS "rp" ON TRUE
func (*UpdateBuilder) LeftJoinSub ¶ added in v0.2.0
func (u *UpdateBuilder) LeftJoinSub(sub *SelectBuilder, as string, first string, args ...any) *UpdateBuilder
LeftJoinSub joins a subquery with a left join.
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").LeftJoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" LEFT JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1) AS
// "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*UpdateBuilder) LeftJoinSubFunc ¶ added in v0.2.0
func (u *UpdateBuilder) LeftJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *UpdateBuilder
LeftJoinSubFunc is JoinSubFunc as a left join.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").LeftJoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").WhereNotNull("p.score")
})
// SELECT * FROM "users" AS "u" LEFT JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id" AND "p"."score" IS NOT NULL
func (*UpdateBuilder) LeftJoinWhere ¶ added in v0.2.0
func (u *UpdateBuilder) LeftJoinWhere(table string, column string, args ...any) *UpdateBuilder
LeftJoinWhere is JoinWhere as a left join.
Example:
conn.Select().From("users as u").LeftJoinWhere("posts as p", "p.score", ">", 10)
// SELECT * FROM "users" AS "u" LEFT JOIN "posts" AS "p" ON "p"."score" > $1
// args: [10]
func (*UpdateBuilder) Limit ¶ added in v0.2.0
func (u *UpdateBuilder) Limit(n int) *UpdateBuilder
Limit sets LIMIT; negative values are ignored.
Example:
conn.Select().From("users").Limit(10)
// SELECT * FROM "users" LIMIT 10
func (*UpdateBuilder) Oldest ¶ added in v0.2.0
func (u *UpdateBuilder) Oldest(column ...string) *UpdateBuilder
Oldest orders by column ascending (default "created_at").
Example:
conn.Select().From("posts").Oldest()
// SELECT * FROM "posts" ORDER BY "created_at" ASC
func (*UpdateBuilder) OrWhere ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhere(column string, args ...any) *UpdateBuilder
OrWhere is Where joined with OR.
Example:
conn.Select().From("users").Where("role", "admin").OrWhere("role", "owner")
// SELECT * FROM "users" WHERE "role" = $1 OR "role" = $2
// args: [admin owner]
func (*UpdateBuilder) OrWhereAll ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereAll(columns []string, args ...any) *UpdateBuilder
OrWhereAll is WhereAll joined with OR.
Example:
conn.Select().From("users").WhereAll([]string{"a", "b"}, 1).OrWhereAll([]string{"c", "d"}, ">", 5)
// SELECT * FROM "users" WHERE ("a" = $1 AND "b" = $2) OR ("c" > $3 AND "d" > $4)
// args: [1 1 5 5]
func (*UpdateBuilder) OrWhereAny ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereAny(columns []string, args ...any) *UpdateBuilder
OrWhereAny is WhereAny joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereAny([]string{"a", "b"}, ">", 5)
// SELECT * FROM "users" WHERE "active" = $1 OR ("a" > $2 OR "b" > $3) args: [true 5 5]
func (*UpdateBuilder) OrWhereBetween ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereBetween(column string, lo any, hi any) *UpdateBuilder
OrWhereBetween is WhereBetween joined with OR.
Example:
conn.Select().From("orders").Where("status", "paid").OrWhereBetween("total", 500, 900)
// SELECT * FROM "orders" WHERE "status" = $1 OR "total" BETWEEN $2 AND $3
// args: [paid 500 900]
func (*UpdateBuilder) OrWhereBetweenColumns ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereBetweenColumns(column string, c1 string, c2 string) *UpdateBuilder
OrWhereBetweenColumns is WhereBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price").
OrWhereBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price" OR "cost"
// BETWEEN "low" AND "high"
func (*UpdateBuilder) OrWhereColumn ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereColumn(first string, args ...any) *UpdateBuilder
OrWhereColumn is WhereColumn joined with OR.
Example:
conn.Select().From("users").WhereColumn("first_name", "last_name").OrWhereColumn("a", "<>", "b")
// SELECT * FROM "users" WHERE "first_name" = "last_name" OR "a" <> "b"
func (*UpdateBuilder) OrWhereDate ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereDate(column string, args ...any) *UpdateBuilder
OrWhereDate is WhereDate joined with OR.
Example:
conn.Select().From("orders").WhereDate("created_at", "2024-01-15").
OrWhereDate("created_at", "2024-02-01")
// SELECT * FROM "orders" WHERE "created_at"::DATE = $1 OR "created_at"::DATE = $2
// args: [2024-01-15 2024-02-01]
func (*UpdateBuilder) OrWhereDay ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereDay(column string, args ...any) *UpdateBuilder
OrWhereDay is WhereDay joined with OR.
Example:
conn.Select().From("orders").WhereDay("created_at", 15).OrWhereDay("created_at", ">", 20)
// SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 OR EXTRACT(DAY FROM
// "created_at") > $2
// args: [15 20]
func (*UpdateBuilder) OrWhereExists ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereExists(sub *SelectBuilder) *UpdateBuilder
OrWhereExists is WhereExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*UpdateBuilder) OrWhereGroup ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereGroup(fn func(*WhereClause)) *UpdateBuilder
OrWhereGroup is WhereGroup joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").Where("age", ">", 30)
})
// SELECT * FROM "users" WHERE "active" = $1 OR ("role" = $2 AND "age" > $3)
// args: [true admin 30]
func (*UpdateBuilder) OrWhereIn ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereIn(column string, values any) *UpdateBuilder
OrWhereIn is WhereIn joined with OR.
Example:
conn.Select().From("users").WhereIn("role", []string{"ann", "bob"}).OrWhereIn("id", []int{9})
// SELECT * FROM "users" WHERE "role" IN ($1, $2) OR "id" IN ($3) args: [ann bob 9]
func (*UpdateBuilder) OrWhereIntegerInRaw ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereIntegerInRaw(column string, values any) *UpdateBuilder
OrWhereIntegerInRaw is WhereIntegerInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1}).
OrWhereIntegerInRaw("id", []int64{7, 8})
// SELECT * FROM "users" WHERE "id" IN (1) OR "id" IN (7, 8)
func (*UpdateBuilder) OrWhereIntegerNotInRaw ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereIntegerNotInRaw(column string, values any) *UpdateBuilder
OrWhereIntegerNotInRaw is WhereIntegerNotInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2}).
OrWhereIntegerNotInRaw("id", []int{3})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2) OR "id" NOT IN (3)
func (*UpdateBuilder) OrWhereJsonContains ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereJsonContains(column string, value any) *UpdateBuilder
OrWhereJsonContains is WhereJsonContains joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR ("options"->'tags')::JSONB @> $2
// args: [true "go"]
func (*UpdateBuilder) OrWhereJsonContainsKey ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereJsonContainsKey(column string) *UpdateBuilder
OrWhereJsonContainsKey is WhereJsonContainsKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*UpdateBuilder) OrWhereJsonDoesntContain ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereJsonDoesntContain(column string, value any) *UpdateBuilder
OrWhereJsonDoesntContain is WhereJsonDoesntContain joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("options"->'tags')::JSONB @> $2
// args: [true "php"]
func (*UpdateBuilder) OrWhereJsonDoesntContainKey ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereJsonDoesntContainKey(column string) *UpdateBuilder
OrWhereJsonDoesntContainKey is WhereJsonDoesntContainKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).
OrWhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1
// OR NOT COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*UpdateBuilder) OrWhereJsonDoesntOverlap ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereJsonDoesntOverlap(column string, value any) *UpdateBuilder
OrWhereJsonDoesntOverlap is WhereJsonDoesntOverlap joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["php"]]
func (*UpdateBuilder) OrWhereJsonLength ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereJsonLength(column string, args ...any) *UpdateBuilder
OrWhereJsonLength is WhereJsonLength joined with OR.
Example:
conn.Select().From("users").WhereJsonLength("options->tags", 0)
.OrWhereJsonLength("options->roles", ">=", 3).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// OR JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) >= $2 args: [0 3]
func (*UpdateBuilder) OrWhereJsonOverlaps ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereJsonOverlaps(column string, value any) *UpdateBuilder
OrWhereJsonOverlaps is WhereJsonOverlaps joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonOverlaps("options->tags", []string{"go"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["go"]]
func (*UpdateBuilder) OrWhereLike ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereLike(column string, value any, caseSensitive ...bool) *UpdateBuilder
OrWhereLike is WhereLike joined with OR.
Example:
conn.Select().From("users").WhereLike("name", "an%").OrWhereLike("name", "bo%")
// SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 OR "name"::TEXT ILIKE $2
// args: [an% bo%]
func (*UpdateBuilder) OrWhereMap ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereMap(m map[string]any) *UpdateBuilder
OrWhereMap is WhereMap joined with OR.
Example:
conn.Select().From("users").WhereMap(map[string]any{"a": 1}).OrWhereMap(map[string]any{"b": 2})
// SELECT * FROM "users" WHERE ("a" = $1) OR ("b" = $2) args: [1 2]
func (*UpdateBuilder) OrWhereMonth ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereMonth(column string, args ...any) *UpdateBuilder
OrWhereMonth is WhereMonth joined with OR.
Example:
conn.Select().From("orders").WhereMonth("created_at", ">=", 6).OrWhereMonth("created_at", 1)
// SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") >= $1 OR EXTRACT(MONTH FROM
// "created_at") = $2
// args: [06 01]
func (*UpdateBuilder) OrWhereNone ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNone(columns []string, args ...any) *UpdateBuilder
OrWhereNone is WhereNone joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereNone([]string{"a", "b"}, 0)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("a" = $2 OR "b" = $3)
// args: [true 0 0]
func (*UpdateBuilder) OrWhereNot ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNot(column string, args ...any) *UpdateBuilder
OrWhereNot adds "OR NOT <predicate>".
Example:
conn.Select().From("users").Where("age", ">", 18).OrWhereNot("status", "<", 3)
// SELECT * FROM "users" WHERE "age" > $1 OR NOT "status" < $2 args: [18 3]
func (*UpdateBuilder) OrWhereNotBetween ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNotBetween(column string, lo any, hi any) *UpdateBuilder
OrWhereNotBetween is WhereNotBetween joined with OR.
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100).OrWhereNotBetween("qty", 1, 5)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 OR "qty" NOT BETWEEN $3 AND $4
// args: [10 100 1 5]
func (*UpdateBuilder) OrWhereNotBetweenColumns ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNotBetweenColumns(column string, c1 string, c2 string) *UpdateBuilder
OrWhereNotBetweenColumns is WhereNotBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price").
OrWhereNotBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price" OR "cost"
// NOT BETWEEN "low" AND "high"
func (*UpdateBuilder) OrWhereNotExists ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNotExists(sub *SelectBuilder) *UpdateBuilder
OrWhereNotExists is WhereNotExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereNotExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*UpdateBuilder) OrWhereNotIn ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNotIn(column string, values any) *UpdateBuilder
OrWhereNotIn is WhereNotIn joined with OR.
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2}).OrWhereNotIn("role", []string{"ann"})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) OR "role" NOT IN ($3) args: [1 2 ann]
func (*UpdateBuilder) OrWhereNotLike ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNotLike(column string, value any, caseSensitive ...bool) *UpdateBuilder
OrWhereNotLike is WhereNotLike joined with OR.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%").OrWhereNotLike("name", "%demo%", true)
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 OR "name"::TEXT NOT LIKE $2
// args: [%test% %demo%]
func (*UpdateBuilder) OrWhereNotNull ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNotNull(column string) *UpdateBuilder
OrWhereNotNull is WhereNotNull joined with OR.
Example:
conn.Select().From("users").WhereNotNull("verified_at").OrWhereNotNull("invited_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL OR "invited_at" IS NOT NULL
func (*UpdateBuilder) OrWhereNull ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNull(column string) *UpdateBuilder
OrWhereNull is WhereNull joined with OR.
Example:
conn.Select().From("users").WhereNull("deleted_at").OrWhereNull("banned_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL OR "banned_at" IS NULL
func (*UpdateBuilder) OrWhereNullSafeEquals ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereNullSafeEquals(column string, value any) *UpdateBuilder
OrWhereNullSafeEquals is WhereNullSafeEquals joined with OR.
Example:
conn.Select().From("users").WhereNullSafeEquals("a", 1).OrWhereNullSafeEquals("b", 2)
// SELECT * FROM "users" WHERE "a" IS NOT DISTINCT FROM $1 OR "b" IS NOT DISTINCT FROM $2
// args: [1 2]
func (*UpdateBuilder) OrWhereRaw ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereRaw(sql string, args ...any) *UpdateBuilder
OrWhereRaw is WhereRaw joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereRaw("age between ? and ?", 18, 30)
// SELECT * FROM "users" WHERE "active" = $1 OR age between $2 and $3
// args: [true 18 30]
func (*UpdateBuilder) OrWhereRowValues ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereRowValues(columns []string, op string, values []any) *UpdateBuilder
OrWhereRowValues is WhereRowValues joined with OR.
Example:
conn.Select().From("events").Where("kind", "x").
OrWhereRowValues([]string{"a", "b"}, "=", []any{1, 2})
// SELECT * FROM "events" WHERE "kind" = $1 OR ("a", "b") = ($2, $3) args: [x 1 2]
func (*UpdateBuilder) OrWhereTime ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereTime(column string, args ...any) *UpdateBuilder
OrWhereTime is WhereTime joined with OR.
Example:
conn.Select().From("orders").WhereTime("created_at", "10:30:00").
OrWhereTime("created_at", "<", "08:00:00")
// SELECT * FROM "orders" WHERE "created_at"::TIME = $1 OR "created_at"::TIME < $2
// args: [10:30:00 08:00:00]
func (*UpdateBuilder) OrWhereValueBetween ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereValueBetween(value any, c1 string, c2 string) *UpdateBuilder
OrWhereValueBetween is WhereValueBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total").
OrWhereValueBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" OR $2 BETWEEN "a" AND
// "b"
// args: [50 7]
func (*UpdateBuilder) OrWhereValueNotBetween ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereValueNotBetween(value any, c1 string, c2 string) *UpdateBuilder
OrWhereValueNotBetween is WhereValueNotBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total").
OrWhereValueNotBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" OR $2 NOT BETWEEN
// "a" AND "b"
// args: [50 7]
func (*UpdateBuilder) OrWhereYear ¶ added in v0.2.0
func (u *UpdateBuilder) OrWhereYear(column string, args ...any) *UpdateBuilder
OrWhereYear is WhereYear joined with OR.
Example:
conn.Select().From("orders").WhereYear("created_at", ">", 2020).OrWhereYear("created_at", 1999)
// SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") > $1 OR EXTRACT(YEAR FROM
// "created_at") = $2
// args: [2020 1999]
func (*UpdateBuilder) OrderBy ¶ added in v0.2.0
func (u *UpdateBuilder) OrderBy(column string, direction ...string) *UpdateBuilder
OrderBy adds ORDER BY column; direction is "asc" (default) or "desc".
Example:
conn.Select().From("users").OrderBy("name").OrderBy("age", "desc")
// SELECT * FROM "users" ORDER BY "name" ASC, "age" DESC
func (*UpdateBuilder) OrderByDesc ¶ added in v0.2.0
func (u *UpdateBuilder) OrderByDesc(column string) *UpdateBuilder
OrderByDesc is OrderBy(column, "desc").
Example:
conn.Select().From("users").OrderByDesc("created_at")
// SELECT * FROM "users" ORDER BY "created_at" DESC
func (*UpdateBuilder) OrderByRaw ¶ added in v0.2.0
func (u *UpdateBuilder) OrderByRaw(sql string, args ...any) *UpdateBuilder
OrderByRaw adds a raw ORDER BY expression (caller-trusted SQL).
Example:
conn.Select().From("users").OrderByRaw("case when role = ? then 0 else 1 end", "admin")
// SELECT * FROM "users" ORDER BY case when role = $1 then 0 else 1 end
// args: [admin]
func (*UpdateBuilder) Prefix ¶ added in v0.2.0
func (u *UpdateBuilder) Prefix(p string) *UpdateBuilder
Prefix sets a table prefix applied to table names, aliases and qualified columns.
Example:
db.Use(db.Postgres).Select("u.id").From("users as u").Prefix("app_")
// SELECT "app_u"."id" FROM "app_users" AS "app_u"
func (*UpdateBuilder) Reorder ¶ added in v0.2.0
func (u *UpdateBuilder) Reorder() *UpdateBuilder
Reorder removes all existing ORDER BY clauses (including a union's).
Example:
conn.Select().From("posts").OrderBy("title").Reorder()
// SELECT * FROM "posts"
func (*UpdateBuilder) ReorderBy ¶ added in v0.2.0
func (u *UpdateBuilder) ReorderBy(column string, direction ...string) *UpdateBuilder
ReorderBy is Reorder followed by OrderBy(column, direction).
Example:
conn.Select().From("posts").OrderBy("title").ReorderBy("id", "desc")
// SELECT * FROM "posts" ORDER BY "id" DESC
func (*UpdateBuilder) Returning ¶ added in v0.2.0
func (u *UpdateBuilder) Returning(columns ...string) *UpdateBuilder
Returning adds a RETURNING clause to insert/update/delete/upsert (Postgres, SQLite >= 3.35; MySQL returns ErrUnsupported). "*" is allowed.
Example:
conn.Insert("users").Values(map[string]any{"name": "Ann"}).Returning("id", "created_at").ToSQL()
// INSERT INTO "users" ("name") VALUES ($1) RETURNING "id", "created_at" args: [Ann]
// MySQL: ToSQL returns ErrUnsupported
func (*UpdateBuilder) RightJoin ¶ added in v0.2.0
func (u *UpdateBuilder) RightJoin(table string, first string, args ...any) *UpdateBuilder
RightJoin adds a right join.
Example:
conn.Select().From("users as u").RightJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id"
func (*UpdateBuilder) RightJoinFunc ¶ added in v0.2.0
func (u *UpdateBuilder) RightJoinFunc(table string, fn func(*JoinClause)) *UpdateBuilder
RightJoinFunc adds a right join with a complex ON clause built in fn.
Example:
conn.Select().From("users as u").RightJoinFunc("posts as p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id").Where("p.score", ">", 10)
})
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."user_id" = "u"."id" AND
// "p"."score" > $1
// args: [10]
func (*UpdateBuilder) RightJoinSub ¶ added in v0.2.0
func (u *UpdateBuilder) RightJoinSub(sub *SelectBuilder, as string, first string, args ...any) *UpdateBuilder
RightJoinSub joins a subquery with a right join.
Example:
sub := conn.Select().From("posts").Select("user_id").Where("score", ">", 10)
conn.Select().From("users as u").RightJoinSub(sub, "t", "t.user_id", "u.id")
// SELECT * FROM "users" AS "u" RIGHT JOIN (SELECT "user_id" FROM "posts" WHERE "score" > $1)
// AS "t" ON "t"."user_id" = "u"."id"
// args: [10]
func (*UpdateBuilder) RightJoinSubFunc ¶ added in v0.2.0
func (u *UpdateBuilder) RightJoinSubFunc(sub *SelectBuilder, as string, fn func(*JoinClause)) *UpdateBuilder
RightJoinSubFunc is JoinSubFunc as a right join.
Example:
sub := conn.Select().From("posts").Select("user_id", "score")
conn.Select().From("users as u").RightJoinSubFunc(sub, "p", func(j *db.JoinClause) {
j.On("p.user_id", "u.id")
})
// SELECT * FROM "users" AS "u" RIGHT JOIN (SELECT "user_id", "score" FROM "posts") AS "p" ON
// "p"."user_id" = "u"."id"
func (*UpdateBuilder) RightJoinWhere ¶ added in v0.2.0
func (u *UpdateBuilder) RightJoinWhere(table string, column string, args ...any) *UpdateBuilder
RightJoinWhere is JoinWhere as a right join.
Example:
conn.Select().From("users as u").RightJoinWhere("posts as p", "p.status", "published")
// SELECT * FROM "users" AS "u" RIGHT JOIN "posts" AS "p" ON "p"."status" = $1
// args: [published]
func (*UpdateBuilder) Set ¶ added in v0.2.0
func (u *UpdateBuilder) Set(column string, value any) *UpdateBuilder
Set assigns value to column. Values may be Raw expressions or *SelectBuilder subqueries; "col->path" keys update inside a JSON column. Setting the same column again replaces the earlier value.
Example:
conn.Update("users").Set("name", "Ann").Set("age", 31).Where("id", 7)
// UPDATE "users" SET "name" = $1, "age" = $2 WHERE "id" = $3 args: [Ann 31 7]
func (*UpdateBuilder) SetMap ¶ added in v0.2.0
func (u *UpdateBuilder) SetMap(values map[string]any) *UpdateBuilder
SetMap assigns every entry of values, in sorted column order.
Example:
conn.Update("users").SetMap(map[string]any{"name": "Ann", "age": 31}).Where("id", 7)
// UPDATE "users" SET "age" = $1, "name" = $2 WHERE "id" = $3 args: [31 Ann 7]
func (*UpdateBuilder) SetRow ¶ added in v0.2.0
func (u *UpdateBuilder) SetRow(row any) *UpdateBuilder
SetRow assigns the columns of a struct (see Row for the `db` tags).
Example:
conn.Update("posts").SetRow(Post{Title: "Hello"}).Where("id", 1)
// UPDATE "posts" SET "title" = $1 WHERE "id" = $2 args: [Hello 1]
func (*UpdateBuilder) StraightJoin ¶ added in v0.2.0
func (u *UpdateBuilder) StraightJoin(table string, first string, args ...any) *UpdateBuilder
StraightJoin adds a MySQL "straight_join"; other dialects error at compile time.
Example:
connMy.Select().From("users as u").StraightJoin("posts as p", "p.user_id", "u.id")
// SELECT * FROM `users` AS `u` STRAIGHT_JOIN `posts` AS `p` ON `p`.`user_id` = `u`.`id`
// connMy is db.Use(db.MySQL); other dialects return ErrUnsupported
func (*UpdateBuilder) Take ¶ added in v0.2.0
func (u *UpdateBuilder) Take(n int) *UpdateBuilder
Take is an alias of Limit.
Example:
conn.Select().From("users").Take(5)
// SELECT * FROM "users" LIMIT 5
func (*UpdateBuilder) ToSQL ¶ added in v0.2.0
func (u *UpdateBuilder) ToSQL() (string, []any, error)
ToSQL compiles the UPDATE into SQL text and its ordered bind arguments. No assignments returns ErrNoValues; no WHERE or LIMIT returns ErrNoWhere unless AllRows was called. Joins use native UPDATE ... JOIN on MySQL and a ctid/rowid subquery on Postgres/SQLite.
Example:
sqlText, args, err := conn.Update("users").Set("name", "Ann").Where("id", 7).ToSQL()
// UPDATE "users" SET "name" = $1 WHERE "id" = $2 args: [Ann 7]
func (*UpdateBuilder) Where ¶ added in v0.2.0
func (u *UpdateBuilder) Where(column string, args ...any) *UpdateBuilder
Where adds an AND predicate. Forms: Where(col, value) means "="; Where(col, op, value). A nil value with "=" / "!=" / "<>" becomes IS [NOT] NULL.
Example:
conn.Select().From("users").Where("active", true).Where("age", ">=", 18)
// SELECT * FROM "users" WHERE "active" = $1 AND "age" >= $2
// args: [true 18]
func (*UpdateBuilder) WhereAll ¶ added in v0.2.0
func (u *UpdateBuilder) WhereAll(columns []string, args ...any) *UpdateBuilder
WhereAll requires the predicate to hold for every column: (a = ? and b = ?).
Example:
conn.Select().From("users").WhereAll([]string{"first_name", "last_name"}, "like", "an%")
// SELECT * FROM "users" WHERE ("first_name"::TEXT LIKE $1 AND "last_name"::TEXT LIKE $2)
// args: [an% an%]
func (*UpdateBuilder) WhereAny ¶ added in v0.2.0
func (u *UpdateBuilder) WhereAny(columns []string, args ...any) *UpdateBuilder
WhereAny requires the predicate to hold for at least one column: (a = ? or b = ?).
Example:
conn.Select().From("users").WhereAny([]string{"first_name", "last_name"}, "ann")
// SELECT * FROM "users" WHERE ("first_name" = $1 OR "last_name" = $2) args: [ann ann]
func (*UpdateBuilder) WhereBetween ¶ added in v0.2.0
func (u *UpdateBuilder) WhereBetween(column string, lo any, hi any) *UpdateBuilder
WhereBetween adds "col BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" BETWEEN $1 AND $2 args: [10 100]
func (*UpdateBuilder) WhereBetweenColumns ¶ added in v0.2.0
func (u *UpdateBuilder) WhereBetweenColumns(column string, c1 string, c2 string) *UpdateBuilder
WhereBetweenColumns adds "col BETWEEN c1 AND c2" comparing against columns.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price"
func (*UpdateBuilder) WhereColumn ¶ added in v0.2.0
func (u *UpdateBuilder) WhereColumn(first string, args ...any) *UpdateBuilder
WhereColumn compares two columns: WhereColumn(a, b) means "=", or WhereColumn(a, op, b).
Example:
conn.Select().From("users").WhereColumn("updated_at", ">", "created_at")
// SELECT * FROM "users" WHERE "updated_at" > "created_at"
func (*UpdateBuilder) WhereDate ¶ added in v0.2.0
func (u *UpdateBuilder) WhereDate(column string, args ...any) *UpdateBuilder
WhereDate compares the date part of a column.
Example:
conn.Select().From("orders").WhereDate("created_at", ">=", "2024-01-15")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::DATE >= $1 args: [2024-01-15]
// MySQL: SELECT * FROM `orders` WHERE DATE(`created_at`) >= ? args: [2024-01-15]
// SQLite: SELECT * FROM "orders" WHERE STRFTIME('%Y-%m-%d', "created_at") >= CAST(? AS TEXT)
// args: [2024-01-15]
func (*UpdateBuilder) WhereDay ¶ added in v0.2.0
func (u *UpdateBuilder) WhereDay(column string, args ...any) *UpdateBuilder
WhereDay compares the day-of-month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereDay("created_at", 15)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 args: [15]
// MySQL: SELECT * FROM `orders` WHERE DAY(`created_at`) = ? args: [15]
func (*UpdateBuilder) WhereExists ¶ added in v0.2.0
func (u *UpdateBuilder) WhereExists(sub *SelectBuilder) *UpdateBuilder
WhereExists adds "EXISTS (subquery)". Build sub with DB.Select.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereExists(posts)
// SELECT * FROM "users" WHERE EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*UpdateBuilder) WhereGroup ¶ added in v0.2.0
func (u *UpdateBuilder) WhereGroup(fn func(*WhereClause)) *UpdateBuilder
WhereGroup wraps the predicates added inside fn in parentheses. fn receives a fresh WhereClause; only its Where* calls are used.
Example:
conn.Select().From("users").Where("active", true).WhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").OrWhere("role", "editor")
})
// SELECT * FROM "users" WHERE "active" = $1 AND ("role" = $2 OR "role" = $3)
// args: [true admin editor]
func (*UpdateBuilder) WhereIn ¶ added in v0.2.0
func (u *UpdateBuilder) WhereIn(column string, values any) *UpdateBuilder
WhereIn adds "col IN (...)". values may be any slice, a scalar, or a *SelectBuilder subquery. An empty list compiles to the always-false "0 = 1".
Example:
conn.Select().From("users").WhereIn("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN ($1, $2, $3) args: [1 2 3]
func (*UpdateBuilder) WhereIntegerInRaw ¶ added in v0.2.0
func (u *UpdateBuilder) WhereIntegerInRaw(column string, values any) *UpdateBuilder
WhereIntegerInRaw inlines integers (no bind args); non-integers record an error. Useful for very large ID lists that would exceed driver parameter limits.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN (1, 2, 3)
func (*UpdateBuilder) WhereIntegerNotInRaw ¶ added in v0.2.0
func (u *UpdateBuilder) WhereIntegerNotInRaw(column string, values any) *UpdateBuilder
WhereIntegerNotInRaw is the negated WhereIntegerInRaw.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2)
func (*UpdateBuilder) WhereJsonContains ¶ added in v0.2.0
func (u *UpdateBuilder) WhereJsonContains(column string, value any) *UpdateBuilder
WhereJsonContains adds a JSON containment test on a column or "col->path". MySQL json_contains, Postgres @> (jsonb), SQLite json_each membership.
Example:
conn.Select().From("users").WhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE ("options"->'tags')::JSONB @> $1 args: ["go"]
func (*UpdateBuilder) WhereJsonContainsKey ¶ added in v0.2.0
func (u *UpdateBuilder) WhereJsonContainsKey(column string) *UpdateBuilder
WhereJsonContainsKey tests that the JSON path "col->key" exists.
Example:
conn.Select().From("users").WhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
// MySQL: SELECT * FROM `users`
// WHERE IFNULL(JSON_CONTAINS_PATH(`options`, 'one', '$."theme"'), 0)
func (*UpdateBuilder) WhereJsonDoesntContain ¶ added in v0.2.0
func (u *UpdateBuilder) WhereJsonDoesntContain(column string, value any) *UpdateBuilder
WhereJsonDoesntContain negates WhereJsonContains.
Example:
conn.Select().From("users").WhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE NOT ("options"->'tags')::JSONB @> $1 args: ["php"]
func (*UpdateBuilder) WhereJsonDoesntContainKey ¶ added in v0.2.0
func (u *UpdateBuilder) WhereJsonDoesntContainKey(column string) *UpdateBuilder
WhereJsonDoesntContainKey negates WhereJsonContainsKey.
Example:
conn.Select().From("users").WhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE NOT COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
func (*UpdateBuilder) WhereJsonDoesntOverlap ¶ added in v0.2.0
func (u *UpdateBuilder) WhereJsonDoesntOverlap(column string, value any) *UpdateBuilder
WhereJsonDoesntOverlap negates WhereJsonOverlaps.
Example:
conn.Select().From("users")
.WhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["php"]]
func (*UpdateBuilder) WhereJsonLength ¶ added in v0.2.0
func (u *UpdateBuilder) WhereJsonLength(column string, args ...any) *UpdateBuilder
WhereJsonLength compares the length of a JSON array: (value) or (operator, value).
Example:
conn.Select().From("users")
.WhereJsonLength("options->tags", 2).WhereJsonLength("options->roles", ">", 1).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// AND JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) > $2 args: [2 1]
func (*UpdateBuilder) WhereJsonOverlaps ¶ added in v0.2.0
func (u *UpdateBuilder) WhereJsonOverlaps(column string, value any) *UpdateBuilder
WhereJsonOverlaps adds json_overlaps (MySQL only; other dialects error at compile time).
Example:
conn.Select().From("users")
.WhereJsonOverlaps("options->tags", []string{"go", "sql"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["go","sql"]]
func (*UpdateBuilder) WhereLike ¶ added in v0.2.0
func (u *UpdateBuilder) WhereLike(column string, value any, caseSensitive ...bool) *UpdateBuilder
WhereLike adds a LIKE predicate, case-insensitive unless caseSensitive[0] is true. Postgres: ILIKE/LIKE. MySQL: LIKE/LIKE BINARY. SQLite: LIKE/GLOB (pattern converted).
Example:
conn.Select().From("users").WhereLike("name", "An%")
// Postgres: SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 args: [An%]
// MySQL: SELECT * FROM `users` WHERE `name` LIKE ? args: [An%]
// SQLite: SELECT * FROM "users" WHERE "name" LIKE ? args: [An%]
func (*UpdateBuilder) WhereMap ¶ added in v0.2.0
func (u *UpdateBuilder) WhereMap(m map[string]any) *UpdateBuilder
WhereMap adds one grouped "a = ? and b = ?" predicate; keys are sorted for stable SQL.
Example:
conn.Select().From("users").WhereMap(map[string]any{"role": "ann", "active": true})
// SELECT * FROM "users" WHERE ("active" = $1 AND "role" = $2) args: [true ann]
func (*UpdateBuilder) WhereMonth ¶ added in v0.2.0
func (u *UpdateBuilder) WhereMonth(column string, args ...any) *UpdateBuilder
WhereMonth compares the month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereMonth("created_at", 3)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") = $1 args: [03]
// MySQL: SELECT * FROM `orders` WHERE MONTH(`created_at`) = ? args: [03]
func (*UpdateBuilder) WhereNone ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNone(columns []string, args ...any) *UpdateBuilder
WhereNone requires the predicate to hold for no column: not (a = ? or b = ?).
Example:
conn.Select().From("users").WhereNone([]string{"first_name", "last_name"}, "like", "%test%")
// SELECT * FROM "users" WHERE NOT ("first_name"::TEXT LIKE $1 OR "last_name"::TEXT LIKE $2)
// args: [%test% %test%]
func (*UpdateBuilder) WhereNot ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNot(column string, args ...any) *UpdateBuilder
WhereNot adds "AND NOT <predicate>".
Example:
conn.Select().From("users").WhereNot("role", "admin")
// SELECT * FROM "users" WHERE NOT "role" = $1 args: [admin]
func (*UpdateBuilder) WhereNotBetween ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNotBetween(column string, lo any, hi any) *UpdateBuilder
WhereNotBetween adds "col NOT BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 args: [10 100]
func (*UpdateBuilder) WhereNotBetweenColumns ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNotBetweenColumns(column string, c1 string, c2 string) *UpdateBuilder
WhereNotBetweenColumns is the negated WhereBetweenColumns.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price"
func (*UpdateBuilder) WhereNotExists ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNotExists(sub *SelectBuilder) *UpdateBuilder
WhereNotExists adds "NOT EXISTS (subquery)".
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereNotExists(posts)
// SELECT * FROM "users" WHERE NOT EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*UpdateBuilder) WhereNotIn ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNotIn(column string, values any) *UpdateBuilder
WhereNotIn adds "col NOT IN (...)". An empty list compiles to "1 = 1".
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) args: [1 2]
func (*UpdateBuilder) WhereNotLike ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNotLike(column string, value any, caseSensitive ...bool) *UpdateBuilder
WhereNotLike is the negated WhereLike.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%")
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 args: [%test%]
func (*UpdateBuilder) WhereNotNull ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNotNull(column string) *UpdateBuilder
WhereNotNull adds "col IS NOT NULL".
Example:
conn.Select().From("users").WhereNotNull("verified_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL
func (*UpdateBuilder) WhereNull ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNull(column string) *UpdateBuilder
WhereNull adds "col IS NULL".
Example:
conn.Select().From("users").WhereNull("deleted_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL
func (*UpdateBuilder) WhereNullSafeEquals ¶ added in v0.2.0
func (u *UpdateBuilder) WhereNullSafeEquals(column string, value any) *UpdateBuilder
WhereNullSafeEquals compares with NULL-safe equality (<=>, IS NOT DISTINCT FROM, IS).
Example:
conn.Select().From("users").WhereNullSafeEquals("manager_id", 7)
// Postgres: SELECT * FROM "users" WHERE "manager_id" IS NOT DISTINCT FROM $1 args: [7]
// MySQL: SELECT * FROM `users` WHERE `manager_id` <=> ? args: [7]
func (*UpdateBuilder) WhereRaw ¶ added in v0.2.0
func (u *UpdateBuilder) WhereRaw(sql string, args ...any) *UpdateBuilder
WhereRaw adds a raw predicate (caller-trusted SQL).
Example:
conn.Select().From("users").WhereRaw("lower(name) = ?", "ann")
// SELECT * FROM "users" WHERE lower(name) = $1
// args: [ann]
func (*UpdateBuilder) WhereRowValues ¶ added in v0.2.0
func (u *UpdateBuilder) WhereRowValues(columns []string, op string, values []any) *UpdateBuilder
WhereRowValues adds "(a, b) op (?, ?)".
Example:
conn.Select().From("events").
WhereRowValues([]string{"created_at", "id"}, ">", []any{"2024-01-15", 42})
// SELECT * FROM "events" WHERE ("created_at", "id") > ($1, $2) args: [2024-01-15 42]
func (*UpdateBuilder) WhereTime ¶ added in v0.2.0
func (u *UpdateBuilder) WhereTime(column string, args ...any) *UpdateBuilder
WhereTime compares the time part of a column.
Example:
conn.Select().From("orders").WhereTime("created_at", ">", "10:30:00")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::TIME > $1 args: [10:30:00]
// MySQL: SELECT * FROM `orders` WHERE TIME(`created_at`) > ? args: [10:30:00]
func (*UpdateBuilder) WhereValueBetween ¶ added in v0.2.0
func (u *UpdateBuilder) WhereValueBetween(value any, c1 string, c2 string) *UpdateBuilder
WhereValueBetween adds "? BETWEEN c1 AND c2" (a value between two columns).
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" args: [50]
func (*UpdateBuilder) WhereValueNotBetween ¶ added in v0.2.0
func (u *UpdateBuilder) WhereValueNotBetween(value any, c1 string, c2 string) *UpdateBuilder
WhereValueNotBetween is the negated WhereValueBetween.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" args: [50]
func (*UpdateBuilder) WhereYear ¶ added in v0.2.0
func (u *UpdateBuilder) WhereYear(column string, args ...any) *UpdateBuilder
WhereYear compares the year of a column.
Example:
conn.Select().From("orders").WhereYear("created_at", 2024)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") = $1
// args: [2024]
// MySQL: SELECT * FROM `orders` WHERE YEAR(`created_at`) = ? args: [2024]
func (*UpdateBuilder) With ¶ added in v0.2.0
func (u *UpdateBuilder) With(name string, q *SelectBuilder, opts ...CTEOption) *UpdateBuilder
With adds a common table expression: "with name as (q)". The name is a table reference, so the table prefix applies to it as it does to From. The subquery is snapshotted: later changes to q do not affect this query. Options name the columns (CTEColumns) or hint materialization (CTEMaterialized, CTENotMaterialized).
On a select, a CTE can feed the query, a subquery, a union member, Count, Exists and Paginate. On an update or delete it is written before the verb (PostgreSQL, MySQL 8, SQLite; MariaDB returns ErrUnsupported). On an insert it is moved into the SELECT given to Using, so it needs Using.
Example:
active := conn.Select().From("users").Where("active", true)
conn.Select().From("active_users").With("active_users", active)
// WITH "active_users" AS (SELECT * FROM "users" WHERE "active" = $1) SELECT * FROM
// "active_users"
// args: [true]
func (*UpdateBuilder) WithRaw ¶ added in v0.2.0
func (u *UpdateBuilder) WithRaw(name string, e Expression, opts ...CTEOption) *UpdateBuilder
WithRaw adds a common table expression whose body is a raw SQL fragment (caller-trusted SQL), e.g. db.Raw("values (?), (?)", 1, 2). It takes the same options as With.
Example:
conn.Select().From("ids").WithRaw("ids", db.Raw("values (?), (?)", 1, 2), db.CTEColumns("id"))
// WITH "ids" ("id") AS (values ($1), ($2)) SELECT * FROM "ids"
// args: [1 2]
func (*UpdateBuilder) WithRecursive ¶ added in v0.2.0
func (u *UpdateBuilder) WithRecursive(name string, anchor *SelectBuilder, step *SelectBuilder, opts ...CTEOption) *UpdateBuilder
WithRecursive adds a recursive common table expression and switches the clause to "with recursive". anchor is the starting query and step the recursive member that refers to name; they are joined with UNION ALL (CTEUnionDistinct for UNION) and written without parentheses, because SQLite rejects a recursive reference inside a subquery. Neither query is modified, and anchor must not have unions.
Example:
anchor := conn.Select().From("categories").Where("parent_id", nil)
step := conn.Select().From("categories as c").Join("tree as t", "c.parent_id", "t.id")
conn.Select().From("tree").WithRecursive("tree", anchor, step)
// WITH RECURSIVE "tree" AS (SELECT * FROM "categories" WHERE "parent_id" IS NULL UNION ALL
// SELECT * FROM "categories" AS "c" INNER JOIN "tree" AS "t" ON "c"."parent_id" =
// "t"."id") SELECT * FROM "tree"
type WhereClause ¶ added in v0.2.0
type WhereClause struct {
// contains filtered or unexported fields
}
WhereClause collects the predicates of a parenthesized WHERE group; it only offers the where methods. It is passed to WhereGroup/OrWhereGroup callbacks.
func (*WhereClause) OrWhere ¶ added in v0.2.0
func (w *WhereClause) OrWhere(column string, args ...any) *WhereClause
OrWhere is Where joined with OR.
Example:
conn.Select().From("users").Where("role", "admin").OrWhere("role", "owner")
// SELECT * FROM "users" WHERE "role" = $1 OR "role" = $2
// args: [admin owner]
func (*WhereClause) OrWhereAll ¶ added in v0.2.0
func (w *WhereClause) OrWhereAll(columns []string, args ...any) *WhereClause
OrWhereAll is WhereAll joined with OR.
Example:
conn.Select().From("users").WhereAll([]string{"a", "b"}, 1).OrWhereAll([]string{"c", "d"}, ">", 5)
// SELECT * FROM "users" WHERE ("a" = $1 AND "b" = $2) OR ("c" > $3 AND "d" > $4)
// args: [1 1 5 5]
func (*WhereClause) OrWhereAny ¶ added in v0.2.0
func (w *WhereClause) OrWhereAny(columns []string, args ...any) *WhereClause
OrWhereAny is WhereAny joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereAny([]string{"a", "b"}, ">", 5)
// SELECT * FROM "users" WHERE "active" = $1 OR ("a" > $2 OR "b" > $3) args: [true 5 5]
func (*WhereClause) OrWhereBetween ¶ added in v0.2.0
func (w *WhereClause) OrWhereBetween(column string, lo any, hi any) *WhereClause
OrWhereBetween is WhereBetween joined with OR.
Example:
conn.Select().From("orders").Where("status", "paid").OrWhereBetween("total", 500, 900)
// SELECT * FROM "orders" WHERE "status" = $1 OR "total" BETWEEN $2 AND $3
// args: [paid 500 900]
func (*WhereClause) OrWhereBetweenColumns ¶ added in v0.2.0
func (w *WhereClause) OrWhereBetweenColumns(column string, c1 string, c2 string) *WhereClause
OrWhereBetweenColumns is WhereBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price").
OrWhereBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price" OR "cost"
// BETWEEN "low" AND "high"
func (*WhereClause) OrWhereColumn ¶ added in v0.2.0
func (w *WhereClause) OrWhereColumn(first string, args ...any) *WhereClause
OrWhereColumn is WhereColumn joined with OR.
Example:
conn.Select().From("users").WhereColumn("first_name", "last_name").OrWhereColumn("a", "<>", "b")
// SELECT * FROM "users" WHERE "first_name" = "last_name" OR "a" <> "b"
func (*WhereClause) OrWhereDate ¶ added in v0.2.0
func (w *WhereClause) OrWhereDate(column string, args ...any) *WhereClause
OrWhereDate is WhereDate joined with OR.
Example:
conn.Select().From("orders").WhereDate("created_at", "2024-01-15").
OrWhereDate("created_at", "2024-02-01")
// SELECT * FROM "orders" WHERE "created_at"::DATE = $1 OR "created_at"::DATE = $2
// args: [2024-01-15 2024-02-01]
func (*WhereClause) OrWhereDay ¶ added in v0.2.0
func (w *WhereClause) OrWhereDay(column string, args ...any) *WhereClause
OrWhereDay is WhereDay joined with OR.
Example:
conn.Select().From("orders").WhereDay("created_at", 15).OrWhereDay("created_at", ">", 20)
// SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 OR EXTRACT(DAY FROM
// "created_at") > $2
// args: [15 20]
func (*WhereClause) OrWhereExists ¶ added in v0.2.0
func (w *WhereClause) OrWhereExists(sub *SelectBuilder) *WhereClause
OrWhereExists is WhereExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*WhereClause) OrWhereGroup ¶ added in v0.2.0
func (w *WhereClause) OrWhereGroup(fn func(*WhereClause)) *WhereClause
OrWhereGroup is WhereGroup joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").Where("age", ">", 30)
})
// SELECT * FROM "users" WHERE "active" = $1 OR ("role" = $2 AND "age" > $3)
// args: [true admin 30]
func (*WhereClause) OrWhereIn ¶ added in v0.2.0
func (w *WhereClause) OrWhereIn(column string, values any) *WhereClause
OrWhereIn is WhereIn joined with OR.
Example:
conn.Select().From("users").WhereIn("role", []string{"ann", "bob"}).OrWhereIn("id", []int{9})
// SELECT * FROM "users" WHERE "role" IN ($1, $2) OR "id" IN ($3) args: [ann bob 9]
func (*WhereClause) OrWhereIntegerInRaw ¶ added in v0.2.0
func (w *WhereClause) OrWhereIntegerInRaw(column string, values any) *WhereClause
OrWhereIntegerInRaw is WhereIntegerInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1}).
OrWhereIntegerInRaw("id", []int64{7, 8})
// SELECT * FROM "users" WHERE "id" IN (1) OR "id" IN (7, 8)
func (*WhereClause) OrWhereIntegerNotInRaw ¶ added in v0.2.0
func (w *WhereClause) OrWhereIntegerNotInRaw(column string, values any) *WhereClause
OrWhereIntegerNotInRaw is WhereIntegerNotInRaw joined with OR.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2}).
OrWhereIntegerNotInRaw("id", []int{3})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2) OR "id" NOT IN (3)
func (*WhereClause) OrWhereJsonContains ¶ added in v0.2.0
func (w *WhereClause) OrWhereJsonContains(column string, value any) *WhereClause
OrWhereJsonContains is WhereJsonContains joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR ("options"->'tags')::JSONB @> $2
// args: [true "go"]
func (*WhereClause) OrWhereJsonContainsKey ¶ added in v0.2.0
func (w *WhereClause) OrWhereJsonContainsKey(column string) *WhereClause
OrWhereJsonContainsKey is WhereJsonContainsKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*WhereClause) OrWhereJsonDoesntContain ¶ added in v0.2.0
func (w *WhereClause) OrWhereJsonDoesntContain(column string, value any) *WhereClause
OrWhereJsonDoesntContain is WhereJsonDoesntContain joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("options"->'tags')::JSONB @> $2
// args: [true "php"]
func (*WhereClause) OrWhereJsonDoesntContainKey ¶ added in v0.2.0
func (w *WhereClause) OrWhereJsonDoesntContainKey(column string) *WhereClause
OrWhereJsonDoesntContainKey is WhereJsonDoesntContainKey joined with OR.
Example:
conn.Select().From("users").Where("active", true).
OrWhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE "active" = $1
// OR NOT COALESCE(("options")::JSONB ? 'theme', FALSE)
// args: [true]
func (*WhereClause) OrWhereJsonDoesntOverlap ¶ added in v0.2.0
func (w *WhereClause) OrWhereJsonDoesntOverlap(column string, value any) *WhereClause
OrWhereJsonDoesntOverlap is WhereJsonDoesntOverlap joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["php"]]
func (*WhereClause) OrWhereJsonLength ¶ added in v0.2.0
func (w *WhereClause) OrWhereJsonLength(column string, args ...any) *WhereClause
OrWhereJsonLength is WhereJsonLength joined with OR.
Example:
conn.Select().From("users").WhereJsonLength("options->tags", 0)
.OrWhereJsonLength("options->roles", ">=", 3).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// OR JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) >= $2 args: [0 3]
func (*WhereClause) OrWhereJsonOverlaps ¶ added in v0.2.0
func (w *WhereClause) OrWhereJsonOverlaps(column string, value any) *WhereClause
OrWhereJsonOverlaps is WhereJsonOverlaps joined with OR.
Example:
conn.Select().From("users").Where("active", true)
.OrWhereJsonOverlaps("options->tags", []string{"go"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE `active` = ?
// OR JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [true ["go"]]
func (*WhereClause) OrWhereLike ¶ added in v0.2.0
func (w *WhereClause) OrWhereLike(column string, value any, caseSensitive ...bool) *WhereClause
OrWhereLike is WhereLike joined with OR.
Example:
conn.Select().From("users").WhereLike("name", "an%").OrWhereLike("name", "bo%")
// SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 OR "name"::TEXT ILIKE $2
// args: [an% bo%]
func (*WhereClause) OrWhereMap ¶ added in v0.2.0
func (w *WhereClause) OrWhereMap(m map[string]any) *WhereClause
OrWhereMap is WhereMap joined with OR.
Example:
conn.Select().From("users").WhereMap(map[string]any{"a": 1}).OrWhereMap(map[string]any{"b": 2})
// SELECT * FROM "users" WHERE ("a" = $1) OR ("b" = $2) args: [1 2]
func (*WhereClause) OrWhereMonth ¶ added in v0.2.0
func (w *WhereClause) OrWhereMonth(column string, args ...any) *WhereClause
OrWhereMonth is WhereMonth joined with OR.
Example:
conn.Select().From("orders").WhereMonth("created_at", ">=", 6).OrWhereMonth("created_at", 1)
// SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") >= $1 OR EXTRACT(MONTH FROM
// "created_at") = $2
// args: [06 01]
func (*WhereClause) OrWhereNone ¶ added in v0.2.0
func (w *WhereClause) OrWhereNone(columns []string, args ...any) *WhereClause
OrWhereNone is WhereNone joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereNone([]string{"a", "b"}, 0)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT ("a" = $2 OR "b" = $3)
// args: [true 0 0]
func (*WhereClause) OrWhereNot ¶ added in v0.2.0
func (w *WhereClause) OrWhereNot(column string, args ...any) *WhereClause
OrWhereNot adds "OR NOT <predicate>".
Example:
conn.Select().From("users").Where("age", ">", 18).OrWhereNot("status", "<", 3)
// SELECT * FROM "users" WHERE "age" > $1 OR NOT "status" < $2 args: [18 3]
func (*WhereClause) OrWhereNotBetween ¶ added in v0.2.0
func (w *WhereClause) OrWhereNotBetween(column string, lo any, hi any) *WhereClause
OrWhereNotBetween is WhereNotBetween joined with OR.
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100).OrWhereNotBetween("qty", 1, 5)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 OR "qty" NOT BETWEEN $3 AND $4
// args: [10 100 1 5]
func (*WhereClause) OrWhereNotBetweenColumns ¶ added in v0.2.0
func (w *WhereClause) OrWhereNotBetweenColumns(column string, c1 string, c2 string) *WhereClause
OrWhereNotBetweenColumns is WhereNotBetweenColumns joined with OR.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price").
OrWhereNotBetweenColumns("cost", "low", "high")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price" OR "cost"
// NOT BETWEEN "low" AND "high"
func (*WhereClause) OrWhereNotExists ¶ added in v0.2.0
func (w *WhereClause) OrWhereNotExists(sub *SelectBuilder) *WhereClause
OrWhereNotExists is WhereNotExists joined with OR.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").Where("active", true).OrWhereNotExists(posts)
// SELECT * FROM "users" WHERE "active" = $1 OR NOT EXISTS (SELECT "1" FROM "posts" WHERE
// "posts"."user_id" = "users"."id")
// args: [true]
func (*WhereClause) OrWhereNotIn ¶ added in v0.2.0
func (w *WhereClause) OrWhereNotIn(column string, values any) *WhereClause
OrWhereNotIn is WhereNotIn joined with OR.
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2}).OrWhereNotIn("role", []string{"ann"})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) OR "role" NOT IN ($3) args: [1 2 ann]
func (*WhereClause) OrWhereNotLike ¶ added in v0.2.0
func (w *WhereClause) OrWhereNotLike(column string, value any, caseSensitive ...bool) *WhereClause
OrWhereNotLike is WhereNotLike joined with OR.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%").OrWhereNotLike("name", "%demo%", true)
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 OR "name"::TEXT NOT LIKE $2
// args: [%test% %demo%]
func (*WhereClause) OrWhereNotNull ¶ added in v0.2.0
func (w *WhereClause) OrWhereNotNull(column string) *WhereClause
OrWhereNotNull is WhereNotNull joined with OR.
Example:
conn.Select().From("users").WhereNotNull("verified_at").OrWhereNotNull("invited_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL OR "invited_at" IS NOT NULL
func (*WhereClause) OrWhereNull ¶ added in v0.2.0
func (w *WhereClause) OrWhereNull(column string) *WhereClause
OrWhereNull is WhereNull joined with OR.
Example:
conn.Select().From("users").WhereNull("deleted_at").OrWhereNull("banned_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL OR "banned_at" IS NULL
func (*WhereClause) OrWhereNullSafeEquals ¶ added in v0.2.0
func (w *WhereClause) OrWhereNullSafeEquals(column string, value any) *WhereClause
OrWhereNullSafeEquals is WhereNullSafeEquals joined with OR.
Example:
conn.Select().From("users").WhereNullSafeEquals("a", 1).OrWhereNullSafeEquals("b", 2)
// SELECT * FROM "users" WHERE "a" IS NOT DISTINCT FROM $1 OR "b" IS NOT DISTINCT FROM $2
// args: [1 2]
func (*WhereClause) OrWhereRaw ¶ added in v0.2.0
func (w *WhereClause) OrWhereRaw(sql string, args ...any) *WhereClause
OrWhereRaw is WhereRaw joined with OR.
Example:
conn.Select().From("users").Where("active", true).OrWhereRaw("age between ? and ?", 18, 30)
// SELECT * FROM "users" WHERE "active" = $1 OR age between $2 and $3
// args: [true 18 30]
func (*WhereClause) OrWhereRowValues ¶ added in v0.2.0
func (w *WhereClause) OrWhereRowValues(columns []string, op string, values []any) *WhereClause
OrWhereRowValues is WhereRowValues joined with OR.
Example:
conn.Select().From("events").Where("kind", "x").
OrWhereRowValues([]string{"a", "b"}, "=", []any{1, 2})
// SELECT * FROM "events" WHERE "kind" = $1 OR ("a", "b") = ($2, $3) args: [x 1 2]
func (*WhereClause) OrWhereTime ¶ added in v0.2.0
func (w *WhereClause) OrWhereTime(column string, args ...any) *WhereClause
OrWhereTime is WhereTime joined with OR.
Example:
conn.Select().From("orders").WhereTime("created_at", "10:30:00").
OrWhereTime("created_at", "<", "08:00:00")
// SELECT * FROM "orders" WHERE "created_at"::TIME = $1 OR "created_at"::TIME < $2
// args: [10:30:00 08:00:00]
func (*WhereClause) OrWhereValueBetween ¶ added in v0.2.0
func (w *WhereClause) OrWhereValueBetween(value any, c1 string, c2 string) *WhereClause
OrWhereValueBetween is WhereValueBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total").
OrWhereValueBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" OR $2 BETWEEN "a" AND
// "b"
// args: [50 7]
func (*WhereClause) OrWhereValueNotBetween ¶ added in v0.2.0
func (w *WhereClause) OrWhereValueNotBetween(value any, c1 string, c2 string) *WhereClause
OrWhereValueNotBetween is WhereValueNotBetween joined with OR.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total").
OrWhereValueNotBetween(7, "a", "b")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" OR $2 NOT BETWEEN
// "a" AND "b"
// args: [50 7]
func (*WhereClause) OrWhereYear ¶ added in v0.2.0
func (w *WhereClause) OrWhereYear(column string, args ...any) *WhereClause
OrWhereYear is WhereYear joined with OR.
Example:
conn.Select().From("orders").WhereYear("created_at", ">", 2020).OrWhereYear("created_at", 1999)
// SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") > $1 OR EXTRACT(YEAR FROM
// "created_at") = $2
// args: [2020 1999]
func (*WhereClause) Where ¶ added in v0.2.0
func (w *WhereClause) Where(column string, args ...any) *WhereClause
Where adds an AND predicate. Forms: Where(col, value) means "="; Where(col, op, value). A nil value with "=" / "!=" / "<>" becomes IS [NOT] NULL.
Example:
conn.Select().From("users").Where("active", true).Where("age", ">=", 18)
// SELECT * FROM "users" WHERE "active" = $1 AND "age" >= $2
// args: [true 18]
func (*WhereClause) WhereAll ¶ added in v0.2.0
func (w *WhereClause) WhereAll(columns []string, args ...any) *WhereClause
WhereAll requires the predicate to hold for every column: (a = ? and b = ?).
Example:
conn.Select().From("users").WhereAll([]string{"first_name", "last_name"}, "like", "an%")
// SELECT * FROM "users" WHERE ("first_name"::TEXT LIKE $1 AND "last_name"::TEXT LIKE $2)
// args: [an% an%]
func (*WhereClause) WhereAny ¶ added in v0.2.0
func (w *WhereClause) WhereAny(columns []string, args ...any) *WhereClause
WhereAny requires the predicate to hold for at least one column: (a = ? or b = ?).
Example:
conn.Select().From("users").WhereAny([]string{"first_name", "last_name"}, "ann")
// SELECT * FROM "users" WHERE ("first_name" = $1 OR "last_name" = $2) args: [ann ann]
func (*WhereClause) WhereBetween ¶ added in v0.2.0
func (w *WhereClause) WhereBetween(column string, lo any, hi any) *WhereClause
WhereBetween adds "col BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" BETWEEN $1 AND $2 args: [10 100]
func (*WhereClause) WhereBetweenColumns ¶ added in v0.2.0
func (w *WhereClause) WhereBetweenColumns(column string, c1 string, c2 string) *WhereClause
WhereBetweenColumns adds "col BETWEEN c1 AND c2" comparing against columns.
Example:
conn.Select().From("products").WhereBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" BETWEEN "min_price" AND "max_price"
func (*WhereClause) WhereColumn ¶ added in v0.2.0
func (w *WhereClause) WhereColumn(first string, args ...any) *WhereClause
WhereColumn compares two columns: WhereColumn(a, b) means "=", or WhereColumn(a, op, b).
Example:
conn.Select().From("users").WhereColumn("updated_at", ">", "created_at")
// SELECT * FROM "users" WHERE "updated_at" > "created_at"
func (*WhereClause) WhereDate ¶ added in v0.2.0
func (w *WhereClause) WhereDate(column string, args ...any) *WhereClause
WhereDate compares the date part of a column.
Example:
conn.Select().From("orders").WhereDate("created_at", ">=", "2024-01-15")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::DATE >= $1 args: [2024-01-15]
// MySQL: SELECT * FROM `orders` WHERE DATE(`created_at`) >= ? args: [2024-01-15]
// SQLite: SELECT * FROM "orders" WHERE STRFTIME('%Y-%m-%d', "created_at") >= CAST(? AS TEXT)
// args: [2024-01-15]
func (*WhereClause) WhereDay ¶ added in v0.2.0
func (w *WhereClause) WhereDay(column string, args ...any) *WhereClause
WhereDay compares the day-of-month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereDay("created_at", 15)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(DAY FROM "created_at") = $1 args: [15]
// MySQL: SELECT * FROM `orders` WHERE DAY(`created_at`) = ? args: [15]
func (*WhereClause) WhereExists ¶ added in v0.2.0
func (w *WhereClause) WhereExists(sub *SelectBuilder) *WhereClause
WhereExists adds "EXISTS (subquery)". Build sub with DB.Select.
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereExists(posts)
// SELECT * FROM "users" WHERE EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*WhereClause) WhereGroup ¶ added in v0.2.0
func (w *WhereClause) WhereGroup(fn func(*WhereClause)) *WhereClause
WhereGroup wraps the predicates added inside fn in parentheses. fn receives a fresh WhereClause; only its Where* calls are used.
Example:
conn.Select().From("users").Where("active", true).WhereGroup(func(q *db.WhereClause) {
q.Where("role", "admin").OrWhere("role", "editor")
})
// SELECT * FROM "users" WHERE "active" = $1 AND ("role" = $2 OR "role" = $3)
// args: [true admin editor]
func (*WhereClause) WhereIn ¶ added in v0.2.0
func (w *WhereClause) WhereIn(column string, values any) *WhereClause
WhereIn adds "col IN (...)". values may be any slice, a scalar, or a *SelectBuilder subquery. An empty list compiles to the always-false "0 = 1".
Example:
conn.Select().From("users").WhereIn("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN ($1, $2, $3) args: [1 2 3]
func (*WhereClause) WhereIntegerInRaw ¶ added in v0.2.0
func (w *WhereClause) WhereIntegerInRaw(column string, values any) *WhereClause
WhereIntegerInRaw inlines integers (no bind args); non-integers record an error. Useful for very large ID lists that would exceed driver parameter limits.
Example:
conn.Select().From("users").WhereIntegerInRaw("id", []int{1, 2, 3})
// SELECT * FROM "users" WHERE "id" IN (1, 2, 3)
func (*WhereClause) WhereIntegerNotInRaw ¶ added in v0.2.0
func (w *WhereClause) WhereIntegerNotInRaw(column string, values any) *WhereClause
WhereIntegerNotInRaw is the negated WhereIntegerInRaw.
Example:
conn.Select().From("users").WhereIntegerNotInRaw("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN (1, 2)
func (*WhereClause) WhereJsonContains ¶ added in v0.2.0
func (w *WhereClause) WhereJsonContains(column string, value any) *WhereClause
WhereJsonContains adds a JSON containment test on a column or "col->path". MySQL json_contains, Postgres @> (jsonb), SQLite json_each membership.
Example:
conn.Select().From("users").WhereJsonContains("options->tags", "go").ToSQL()
// SELECT * FROM "users" WHERE ("options"->'tags')::JSONB @> $1 args: ["go"]
func (*WhereClause) WhereJsonContainsKey ¶ added in v0.2.0
func (w *WhereClause) WhereJsonContainsKey(column string) *WhereClause
WhereJsonContainsKey tests that the JSON path "col->key" exists.
Example:
conn.Select().From("users").WhereJsonContainsKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
// MySQL: SELECT * FROM `users`
// WHERE IFNULL(JSON_CONTAINS_PATH(`options`, 'one', '$."theme"'), 0)
func (*WhereClause) WhereJsonDoesntContain ¶ added in v0.2.0
func (w *WhereClause) WhereJsonDoesntContain(column string, value any) *WhereClause
WhereJsonDoesntContain negates WhereJsonContains.
Example:
conn.Select().From("users").WhereJsonDoesntContain("options->tags", "php").ToSQL()
// SELECT * FROM "users" WHERE NOT ("options"->'tags')::JSONB @> $1 args: ["php"]
func (*WhereClause) WhereJsonDoesntContainKey ¶ added in v0.2.0
func (w *WhereClause) WhereJsonDoesntContainKey(column string) *WhereClause
WhereJsonDoesntContainKey negates WhereJsonContainsKey.
Example:
conn.Select().From("users").WhereJsonDoesntContainKey("options->theme").ToSQL()
// SELECT * FROM "users" WHERE NOT COALESCE(("options")::JSONB ? 'theme', FALSE) args: []
func (*WhereClause) WhereJsonDoesntOverlap ¶ added in v0.2.0
func (w *WhereClause) WhereJsonDoesntOverlap(column string, value any) *WhereClause
WhereJsonDoesntOverlap negates WhereJsonOverlaps.
Example:
conn.Select().From("users")
.WhereJsonDoesntOverlap("options->tags", []string{"php"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE NOT JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["php"]]
func (*WhereClause) WhereJsonLength ¶ added in v0.2.0
func (w *WhereClause) WhereJsonLength(column string, args ...any) *WhereClause
WhereJsonLength compares the length of a JSON array: (value) or (operator, value).
Example:
conn.Select().From("users")
.WhereJsonLength("options->tags", 2).WhereJsonLength("options->roles", ">", 1).ToSQL()
// SELECT * FROM "users" WHERE JSONB_ARRAY_LENGTH(("options"->'tags')::JSONB) = $1
// AND JSONB_ARRAY_LENGTH(("options"->'roles')::JSONB) > $2 args: [2 1]
func (*WhereClause) WhereJsonOverlaps ¶ added in v0.2.0
func (w *WhereClause) WhereJsonOverlaps(column string, value any) *WhereClause
WhereJsonOverlaps adds json_overlaps (MySQL only; other dialects error at compile time).
Example:
conn.Select().From("users")
.WhereJsonOverlaps("options->tags", []string{"go", "sql"}).ToSQL() // MySQL conn
// SELECT * FROM `users` WHERE JSON_OVERLAPS(JSON_EXTRACT(`options`, '$."tags"'), ?)
// args: [["go","sql"]]
func (*WhereClause) WhereLike ¶ added in v0.2.0
func (w *WhereClause) WhereLike(column string, value any, caseSensitive ...bool) *WhereClause
WhereLike adds a LIKE predicate, case-insensitive unless caseSensitive[0] is true. Postgres: ILIKE/LIKE. MySQL: LIKE/LIKE BINARY. SQLite: LIKE/GLOB (pattern converted).
Example:
conn.Select().From("users").WhereLike("name", "An%")
// Postgres: SELECT * FROM "users" WHERE "name"::TEXT ILIKE $1 args: [An%]
// MySQL: SELECT * FROM `users` WHERE `name` LIKE ? args: [An%]
// SQLite: SELECT * FROM "users" WHERE "name" LIKE ? args: [An%]
func (*WhereClause) WhereMap ¶ added in v0.2.0
func (w *WhereClause) WhereMap(m map[string]any) *WhereClause
WhereMap adds one grouped "a = ? and b = ?" predicate; keys are sorted for stable SQL.
Example:
conn.Select().From("users").WhereMap(map[string]any{"role": "ann", "active": true})
// SELECT * FROM "users" WHERE ("active" = $1 AND "role" = $2) args: [true ann]
func (*WhereClause) WhereMonth ¶ added in v0.2.0
func (w *WhereClause) WhereMonth(column string, args ...any) *WhereClause
WhereMonth compares the month of a column (numeric values are zero-padded).
Example:
conn.Select().From("orders").WhereMonth("created_at", 3)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(MONTH FROM "created_at") = $1 args: [03]
// MySQL: SELECT * FROM `orders` WHERE MONTH(`created_at`) = ? args: [03]
func (*WhereClause) WhereNone ¶ added in v0.2.0
func (w *WhereClause) WhereNone(columns []string, args ...any) *WhereClause
WhereNone requires the predicate to hold for no column: not (a = ? or b = ?).
Example:
conn.Select().From("users").WhereNone([]string{"first_name", "last_name"}, "like", "%test%")
// SELECT * FROM "users" WHERE NOT ("first_name"::TEXT LIKE $1 OR "last_name"::TEXT LIKE $2)
// args: [%test% %test%]
func (*WhereClause) WhereNot ¶ added in v0.2.0
func (w *WhereClause) WhereNot(column string, args ...any) *WhereClause
WhereNot adds "AND NOT <predicate>".
Example:
conn.Select().From("users").WhereNot("role", "admin")
// SELECT * FROM "users" WHERE NOT "role" = $1 args: [admin]
func (*WhereClause) WhereNotBetween ¶ added in v0.2.0
func (w *WhereClause) WhereNotBetween(column string, lo any, hi any) *WhereClause
WhereNotBetween adds "col NOT BETWEEN lo AND hi".
Example:
conn.Select().From("orders").WhereNotBetween("total", 10, 100)
// SELECT * FROM "orders" WHERE "total" NOT BETWEEN $1 AND $2 args: [10 100]
func (*WhereClause) WhereNotBetweenColumns ¶ added in v0.2.0
func (w *WhereClause) WhereNotBetweenColumns(column string, c1 string, c2 string) *WhereClause
WhereNotBetweenColumns is the negated WhereBetweenColumns.
Example:
conn.Select().From("products").WhereNotBetweenColumns("price", "min_price", "max_price")
// SELECT * FROM "products" WHERE "price" NOT BETWEEN "min_price" AND "max_price"
func (*WhereClause) WhereNotExists ¶ added in v0.2.0
func (w *WhereClause) WhereNotExists(sub *SelectBuilder) *WhereClause
WhereNotExists adds "NOT EXISTS (subquery)".
Example:
posts := conn.Select().From("posts").Select("1").WhereColumn("posts.user_id", "users.id")
conn.Select().From("users").WhereNotExists(posts)
// SELECT * FROM "users" WHERE NOT EXISTS (SELECT "1" FROM "posts" WHERE "posts"."user_id" =
// "users"."id")
func (*WhereClause) WhereNotIn ¶ added in v0.2.0
func (w *WhereClause) WhereNotIn(column string, values any) *WhereClause
WhereNotIn adds "col NOT IN (...)". An empty list compiles to "1 = 1".
Example:
conn.Select().From("users").WhereNotIn("id", []int{1, 2})
// SELECT * FROM "users" WHERE "id" NOT IN ($1, $2) args: [1 2]
func (*WhereClause) WhereNotLike ¶ added in v0.2.0
func (w *WhereClause) WhereNotLike(column string, value any, caseSensitive ...bool) *WhereClause
WhereNotLike is the negated WhereLike.
Example:
conn.Select().From("users").WhereNotLike("name", "%test%")
// SELECT * FROM "users" WHERE "name"::TEXT NOT ILIKE $1 args: [%test%]
func (*WhereClause) WhereNotNull ¶ added in v0.2.0
func (w *WhereClause) WhereNotNull(column string) *WhereClause
WhereNotNull adds "col IS NOT NULL".
Example:
conn.Select().From("users").WhereNotNull("verified_at")
// SELECT * FROM "users" WHERE "verified_at" IS NOT NULL
func (*WhereClause) WhereNull ¶ added in v0.2.0
func (w *WhereClause) WhereNull(column string) *WhereClause
WhereNull adds "col IS NULL".
Example:
conn.Select().From("users").WhereNull("deleted_at")
// SELECT * FROM "users" WHERE "deleted_at" IS NULL
func (*WhereClause) WhereNullSafeEquals ¶ added in v0.2.0
func (w *WhereClause) WhereNullSafeEquals(column string, value any) *WhereClause
WhereNullSafeEquals compares with NULL-safe equality (<=>, IS NOT DISTINCT FROM, IS).
Example:
conn.Select().From("users").WhereNullSafeEquals("manager_id", 7)
// Postgres: SELECT * FROM "users" WHERE "manager_id" IS NOT DISTINCT FROM $1 args: [7]
// MySQL: SELECT * FROM `users` WHERE `manager_id` <=> ? args: [7]
func (*WhereClause) WhereRaw ¶ added in v0.2.0
func (w *WhereClause) WhereRaw(sql string, args ...any) *WhereClause
WhereRaw adds a raw predicate (caller-trusted SQL).
Example:
conn.Select().From("users").WhereRaw("lower(name) = ?", "ann")
// SELECT * FROM "users" WHERE lower(name) = $1
// args: [ann]
func (*WhereClause) WhereRowValues ¶ added in v0.2.0
func (w *WhereClause) WhereRowValues(columns []string, op string, values []any) *WhereClause
WhereRowValues adds "(a, b) op (?, ?)".
Example:
conn.Select().From("events").
WhereRowValues([]string{"created_at", "id"}, ">", []any{"2024-01-15", 42})
// SELECT * FROM "events" WHERE ("created_at", "id") > ($1, $2) args: [2024-01-15 42]
func (*WhereClause) WhereTime ¶ added in v0.2.0
func (w *WhereClause) WhereTime(column string, args ...any) *WhereClause
WhereTime compares the time part of a column.
Example:
conn.Select().From("orders").WhereTime("created_at", ">", "10:30:00")
// Postgres: SELECT * FROM "orders" WHERE "created_at"::TIME > $1 args: [10:30:00]
// MySQL: SELECT * FROM `orders` WHERE TIME(`created_at`) > ? args: [10:30:00]
func (*WhereClause) WhereValueBetween ¶ added in v0.2.0
func (w *WhereClause) WhereValueBetween(value any, c1 string, c2 string) *WhereClause
WhereValueBetween adds "? BETWEEN c1 AND c2" (a value between two columns).
Example:
conn.Select().From("coupons").WhereValueBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 BETWEEN "min_total" AND "max_total" args: [50]
func (*WhereClause) WhereValueNotBetween ¶ added in v0.2.0
func (w *WhereClause) WhereValueNotBetween(value any, c1 string, c2 string) *WhereClause
WhereValueNotBetween is the negated WhereValueBetween.
Example:
conn.Select().From("coupons").WhereValueNotBetween(50, "min_total", "max_total")
// SELECT * FROM "coupons" WHERE $1 NOT BETWEEN "min_total" AND "max_total" args: [50]
func (*WhereClause) WhereYear ¶ added in v0.2.0
func (w *WhereClause) WhereYear(column string, args ...any) *WhereClause
WhereYear compares the year of a column.
Example:
conn.Select().From("orders").WhereYear("created_at", 2024)
// Postgres: SELECT * FROM "orders" WHERE EXTRACT(YEAR FROM "created_at") = $1
// args: [2024]
// MySQL: SELECT * FROM `orders` WHERE YEAR(`created_at`) = ? args: [2024]