Skip to main content

pkg/dml

The DML package builds type-safe SQL queries (SELECT, INSERT, UPDATE, DELETE).

SelectQuery

query := Users.SelectAll().
Where(Users.Email.Eq("john@example.com")).
OrderByDESC(Users.CreatedAt).
Limit(10)

Methods

MethodDescription
Fields(cols...)Select specific columns
Distinct()DISTINCT
Where(clause...)WHERE conditions
GroupBy(cols...)GROUP BY
Having(clause...)HAVING
OrderByASC(cols...)ORDER BY ASC
OrderByDESC(cols...)ORDER BY DESC
OrderByRaw(sql...)Raw ORDER BY
Limit(n)LIMIT
Offset(n)OFFSET
ForUpdate()FOR UPDATE
InnerJoin(table, alias, on...)INNER JOIN
LeftJoin(table, alias, on...)LEFT JOIN
RightJoin(table, alias, on...)RIGHT JOIN
FullJoin(table, alias, on...)FULL JOIN

InsertQuery

query := Users.Insert().
Columns(Users.Email, Users.Name).
Values("john@example.com", "John").
Returning(Users.ID)

UpdateQuery

query := Users.Update().
Set(Users.Name.Set("Jane")).
Set(Users.IsActive.Set(true)).
Where(Users.ID.Eq(1)).
Returning(Users.ID)

DeleteQuery

query := Users.Delete().
Where(Users.ID.Eq(1))

Clause Operators

Comparison

OperatorSQL
Col.Eq(val)= val
Col.Neq(val)!= val
Col.Gt(val)> val
Col.Gte(val)>= val
Col.Lt(val)< val
Col.Lte(val)<= val

Set Operations

OperatorSQL
Col.In(vals...)IN (...)
Col.NotIn(vals...)NOT IN (...)
Col.InOf(subquery)IN (SELECT ...)
Col.Between(a, b)BETWEEN a AND b
Col.NotBetween(a, b)NOT BETWEEN

Text

OperatorSQL
Col.Like(pattern)LIKE
Col.ILike(pattern)ILIKE
Col.NotLike(pattern)NOT LIKE

Null

OperatorSQL
Col.IsNull()IS NULL
Col.IsNotNull()IS NOT NULL

Array (PostgreSQL)

OperatorSQL
Col.ARRAYContains(vals...)@>
Col.ARRAYContainedBy(vals...)<@
Col.ARRAYOverlap(vals...)&&

JSON

OperatorSQL
Col.JSONContains(json)@>
Col.JSONHasKey(key)?
Col.JSONHasAnyKey(keys...)`?
Col.JSONHasAllKeys(keys...)?&

Subqueries

OperatorSQL
Col.EqOf(subquery)= (SELECT ...)
Col.InOf(subquery)IN (SELECT ...)
Col.AnyOf(subquery)= ANY(SELECT ...)
Table.ExistsOf(subquery)EXISTS (...)
Table.NotExistsOf(subquery)NOT EXISTS (...)

Correlated Subqueries

Use Table.Ref(column) to reference an outer table's column inside a subquery:

OperatorSQL
Table.Ref(col)Returns a column reference (table.col)
Col.EqRef(ref)col = other_table.col
Col.NeqRef(ref)col != other_table.col
// SELECT * FROM users WHERE EXISTS (
// SELECT 1 FROM orders WHERE orders.user_id = users.id AND orders.status = $1)
subquery := Orders.Select1().Where(
Orders.UserID.EqRef(Users.Table.Ref(UserColumnID)),
Orders.Status.Eq("PAID"),
)
query := Users.SelectAll().Where(Users.Table.ExistsOf(subquery))

Logical

OperatorSQL
Table.And(clauses...)(a AND b)
Table.Or(clauses...)(a OR b)
Table.Raw(sql, args...)Raw SQL