Documentation
¶
Overview ¶
builder an idiomatch SQL builder, and query package.
__ _ ___ __ _ _ _ / _` |/ _ \ / _` | | | | | (_| | (_) | (_| | |_| | \__, |\___/ \__, |\__,_| |___/ |_|
Please see https://github.com/Tooooommy/builder for an introduction to builder.
Index ¶
- Constants
- Variables
- func AVG(col any) exp.SQLFunctionExpression
- func All(val any) exp.SQLFunctionExpression
- func And(expressions ...exp.Expression) exp.ExpressionList
- func Any(val any) exp.SQLFunctionExpression
- func C(col string) exp.IdentifierExpression
- func COALESCE(vals ...any) exp.SQLFunctionExpression
- func COUNT(col any) exp.SQLFunctionExpression
- func CUME_DIST() exp.SQLFunctionExpression
- func Case() exp.CaseExpression
- func Cast(e exp.Expression, t string) exp.CastExpression
- func DENSE_RANK() exp.SQLFunctionExpression
- func DISTINCT(col any) exp.SQLFunctionExpression
- func Default() exp.LiteralExpression
- func DeregisterDialect(name string)
- func DoNothing() exp.ConflictExpression
- func DoUpdate(target string, update any) exp.ConflictUpdateExpression
- func FIRST(col any) exp.SQLFunctionExpression
- func FIRST_VALUE(val any) exp.SQLFunctionExpression
- func Func(name string, args ...any) exp.SQLFunctionExpression
- func I(ident string) exp.IdentifierExpression
- func L(sql string, args ...any) exp.LiteralExpression
- func LAST(col any) exp.SQLFunctionExpression
- func LAST_VALUE(val any) exp.SQLFunctionExpression
- func Lateral(table exp.AppendableExpression) exp.LateralExpression
- func Literal(sql string, args ...any) exp.LiteralExpression
- func MAX(col any) exp.SQLFunctionExpression
- func MIN(col any) exp.SQLFunctionExpression
- func NTH_VALUE(val any, nth int) exp.SQLFunctionExpression
- func NTILE(n int) exp.SQLFunctionExpression
- func On(expressions ...exp.Expression) exp.JoinCondition
- func Or(expressions ...exp.Expression) exp.ExpressionList
- func PERCENT_RANK() exp.SQLFunctionExpression
- func RANK() exp.SQLFunctionExpression
- func ROW_NUMBER() exp.SQLFunctionExpression
- func Range(start, end any) exp.RangeVal
- func RegisterDialect(name string, do *SQLDialectOptions)
- func S(schema string) exp.IdentifierExpression
- func SUM(col any) exp.SQLFunctionExpression
- func SetColumnRenameFunction(renameFunc func(string) string)
- func SetDefaultPrepared(prepared bool)
- func SetIgnoreUntaggedFields(ignore bool)
- func SetTimeLocation(loc *time.Location)
- func Star() exp.LiteralExpression
- func T(table string) exp.IdentifierExpression
- func Using(columns ...any) exp.JoinCondition
- func V(val any) exp.LiteralExpression
- func W(ws ...string) exp.WindowExpression
- type Database
- func (d *Database) Delete(table any) *DeleteDataset
- func (d *Database) Dialect() string
- func (d *Database) Exec(query string, args ...any) (sql.Result, error)
- func (d *Database) ExecCtx(ctx context.Context, query string, args ...any) (sql.Result, error)
- func (d *Database) From(from ...any) *SelectDataset
- func (d *Database) Insert(table any) *InsertDataset
- func (d *Database) Logger(logger logx.Logger)
- func (d *Database) Prepare(query string) (sqlx.StmtSession, error)
- func (d *Database) PrepareCtx(ctx context.Context, query string) (sqlx.StmtSession, error)
- func (d *Database) QueryRow(v any, query string, args ...any) error
- func (d *Database) QueryRowCtx(ctx context.Context, v any, query string, args ...any) error
- func (d *Database) QueryRowPartial(v any, query string, args ...any) error
- func (d *Database) QueryRowPartialCtx(ctx context.Context, v any, query string, args ...any) error
- func (d *Database) QueryRows(v any, query string, args ...any) error
- func (d *Database) QueryRowsCtx(ctx context.Context, v any, query string, args ...any) error
- func (d *Database) QueryRowsPartial(v any, query string, args ...any) error
- func (d *Database) QueryRowsPartialCtx(ctx context.Context, v any, query string, args ...any) error
- func (d *Database) Select(cols ...any) *SelectDataset
- func (d *Database) Trace(ctx context.Context, op, sqlString string, args ...any)
- func (d *Database) Transact(fn func(td *TxDatabase) error) (err error)
- func (d *Database) TransactCtx(ctx context.Context, fn func(ctx context.Context, td *TxDatabase) error) (err error)
- func (d *Database) Truncate(table ...any) *TruncateDataset
- func (d *Database) Update(table any) *UpdateDataset
- type DeleteDataset
- func (dd *DeleteDataset) AppendSQL(b sb.SQLBuilder)
- func (dd *DeleteDataset) ClearLimit() *DeleteDataset
- func (dd *DeleteDataset) ClearOrder() *DeleteDataset
- func (dd *DeleteDataset) ClearWhere() *DeleteDataset
- func (dd *DeleteDataset) Clone() exp.Expression
- func (dd *DeleteDataset) Dialect() SQLDialect
- func (dd *DeleteDataset) Error() error
- func (dd *DeleteDataset) Exec() (sql.Result, error)
- func (dd *DeleteDataset) ExecCtx(ctx context.Context) (sql.Result, error)
- func (dd *DeleteDataset) Expression() exp.Expression
- func (dd *DeleteDataset) From(table any) *DeleteDataset
- func (dd *DeleteDataset) GetAs() exp.IdentifierExpression
- func (dd *DeleteDataset) GetClauses() exp.DeleteClauses
- func (dd *DeleteDataset) IsPrepared() bool
- func (dd *DeleteDataset) Limit(limit uint) *DeleteDataset
- func (dd *DeleteDataset) LimitAll() *DeleteDataset
- func (dd *DeleteDataset) Order(order ...exp.OrderedExpression) *DeleteDataset
- func (dd *DeleteDataset) OrderAppend(order ...exp.OrderedExpression) *DeleteDataset
- func (dd *DeleteDataset) OrderPrepend(order ...exp.OrderedExpression) *DeleteDataset
- func (dd *DeleteDataset) Prepared(prepared bool) *DeleteDataset
- func (dd *DeleteDataset) QueryRow(v any) error
- func (dd *DeleteDataset) QueryRowCtx(ctx context.Context, v any) error
- func (dd *DeleteDataset) QueryRowPartial(v any) error
- func (dd *DeleteDataset) QueryRowPartialCtx(ctx context.Context, v any) error
- func (dd *DeleteDataset) QueryRows(v any) error
- func (dd *DeleteDataset) QueryRowsCtx(ctx context.Context, v any) error
- func (dd *DeleteDataset) QueryRowsPartial(v any) error
- func (dd *DeleteDataset) QueryRowsPartialCtx(ctx context.Context, v any) error
- func (dd *DeleteDataset) Returning(returning ...any) *DeleteDataset
- func (dd *DeleteDataset) ReturnsColumns() bool
- func (dd *DeleteDataset) SetDialect(dialect SQLDialect) *DeleteDataset
- func (dd *DeleteDataset) SetError(err error) *DeleteDataset
- func (dd *DeleteDataset) ToSQL() (sql string, params []any, err error)
- func (dd *DeleteDataset) Where(expressions ...exp.Expression) *DeleteDataset
- func (dd *DeleteDataset) With(name string, subquery exp.Expression) *DeleteDataset
- func (dd *DeleteDataset) WithDialect(dl string) *DeleteDataset
- func (dd *DeleteDataset) WithRecursive(name string, subquery exp.Expression) *DeleteDataset
- type DialectWrapper
- func (dw DialectWrapper) DB(db sqlx.SqlConn) *Database
- func (dw DialectWrapper) Delete(table any) *DeleteDataset
- func (dw DialectWrapper) From(table ...any) *SelectDataset
- func (dw DialectWrapper) Insert(table any) *InsertDataset
- func (dw DialectWrapper) Select(cols ...any) *SelectDataset
- func (dw DialectWrapper) Truncate(table ...any) *TruncateDataset
- func (dw DialectWrapper) Update(table any) *UpdateDataset
- type Ex
- type ExOr
- type Expression
- type InsertDataset
- func (id *InsertDataset) AppendSQL(b sb.SQLBuilder)
- func (id *InsertDataset) As(alias string) *InsertDataset
- func (id *InsertDataset) ClearCols() *InsertDataset
- func (id *InsertDataset) ClearOnConflict() *InsertDataset
- func (id *InsertDataset) ClearRows() *InsertDataset
- func (id *InsertDataset) ClearVals() *InsertDataset
- func (id *InsertDataset) Clone() exp.Expression
- func (id *InsertDataset) Cols(cols ...any) *InsertDataset
- func (id *InsertDataset) ColsAppend(cols ...any) *InsertDataset
- func (id *InsertDataset) Dialect() SQLDialect
- func (id *InsertDataset) Error() error
- func (id *InsertDataset) Exec() (sql.Result, error)
- func (id *InsertDataset) ExecCtx(ctx context.Context) (sql.Result, error)
- func (id *InsertDataset) Expression() exp.Expression
- func (id *InsertDataset) FromQuery(from exp.AppendableExpression) *InsertDataset
- func (id *InsertDataset) GetAs() exp.IdentifierExpression
- func (id *InsertDataset) GetClauses() exp.InsertClauses
- func (id *InsertDataset) Into(into any) *InsertDataset
- func (id *InsertDataset) IsPrepared() bool
- func (id *InsertDataset) OnConflict(conflict exp.ConflictExpression) *InsertDataset
- func (id *InsertDataset) Prepared(prepared bool) *InsertDataset
- func (id *InsertDataset) QueryRow(v any) error
- func (id *InsertDataset) QueryRowCtx(ctx context.Context, v any) error
- func (id *InsertDataset) QueryRowPartial(v any) error
- func (id *InsertDataset) QueryRowPartialCtx(ctx context.Context, v any) error
- func (id *InsertDataset) QueryRows(v any) error
- func (id *InsertDataset) QueryRowsCtx(ctx context.Context, v any) error
- func (id *InsertDataset) QueryRowsPartial(v any) error
- func (id *InsertDataset) QueryRowsPartialCtx(ctx context.Context, v any) error
- func (id *InsertDataset) Returning(returning ...any) *InsertDataset
- func (id *InsertDataset) ReturnsColumns() bool
- func (id *InsertDataset) Rows(rows ...any) *InsertDataset
- func (id *InsertDataset) SetDialect(dialect SQLDialect) *InsertDataset
- func (id *InsertDataset) SetError(err error) *InsertDataset
- func (id *InsertDataset) ToSQL() (sql string, params []any, err error)
- func (id *InsertDataset) Vals(vals ...[]any) *InsertDataset
- func (id *InsertDataset) With(name string, subquery exp.Expression) *InsertDataset
- func (id *InsertDataset) WithDialect(dl string) *InsertDataset
- func (id *InsertDataset) WithRecursive(name string, subquery exp.Expression) *InsertDataset
- type Op
- type Record
- type SQLDialect
- type SQLDialectOptions
- type SelectDataset
- func (sd *SelectDataset) AppendSQL(b sb.SQLBuilder)
- func (sd *SelectDataset) As(alias string) *SelectDataset
- func (sd *SelectDataset) ClearLimit() *SelectDataset
- func (sd *SelectDataset) ClearOffset() *SelectDataset
- func (sd *SelectDataset) ClearOrder() *SelectDataset
- func (sd *SelectDataset) ClearSelect() *SelectDataset
- func (sd *SelectDataset) ClearWhere() *SelectDataset
- func (sd *SelectDataset) ClearWindow() *SelectDataset
- func (sd *SelectDataset) Clone() exp.Expression
- func (sd *SelectDataset) CompoundFromSelf() *SelectDataset
- func (sd *SelectDataset) Count() (int64, error)
- func (sd *SelectDataset) CountContext(ctx context.Context) (int64, error)
- func (sd *SelectDataset) CrossJoin(table exp.Expression) *SelectDataset
- func (sd *SelectDataset) Delete() *DeleteDataset
- func (sd *SelectDataset) Dialect() SQLDialect
- func (sd *SelectDataset) Distinct(on ...any) *SelectDataset
- func (sd *SelectDataset) Error() error
- func (sd *SelectDataset) Expression() exp.Expression
- func (sd *SelectDataset) ForKeyShare(waitOption exp.WaitOption, of ...exp.IdentifierExpression) *SelectDataset
- func (sd *SelectDataset) ForNoKeyUpdate(waitOption exp.WaitOption, of ...exp.IdentifierExpression) *SelectDataset
- func (sd *SelectDataset) ForShare(waitOption exp.WaitOption, of ...exp.IdentifierExpression) *SelectDataset
- func (sd *SelectDataset) ForUpdate(waitOption exp.WaitOption, of ...exp.IdentifierExpression) *SelectDataset
- func (sd *SelectDataset) From(from ...any) *SelectDataset
- func (sd *SelectDataset) FromSelf() *SelectDataset
- func (sd *SelectDataset) FullJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
- func (sd *SelectDataset) FullOuterJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
- func (sd *SelectDataset) GetAs() exp.IdentifierExpression
- func (sd *SelectDataset) GetClauses() exp.SelectClauses
- func (sd *SelectDataset) GroupBy(groupBy ...any) *SelectDataset
- func (sd *SelectDataset) GroupByAppend(groupBy ...any) *SelectDataset
- func (sd *SelectDataset) Having(expressions ...exp.Expression) *SelectDataset
- func (sd *SelectDataset) InnerJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
- func (sd *SelectDataset) Insert() *InsertDataset
- func (sd *SelectDataset) Intersect(other *SelectDataset) *SelectDataset
- func (sd *SelectDataset) IntersectAll(other *SelectDataset) *SelectDataset
- func (sd *SelectDataset) IsPrepared() bool
- func (sd *SelectDataset) Join(table exp.Expression, condition exp.JoinCondition) *SelectDataset
- func (sd *SelectDataset) LeftJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
- func (sd *SelectDataset) LeftOuterJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
- func (sd *SelectDataset) Limit(limit uint) *SelectDataset
- func (sd *SelectDataset) LimitAll() *SelectDataset
- func (sd *SelectDataset) NaturalFullJoin(table exp.Expression) *SelectDataset
- func (sd *SelectDataset) NaturalJoin(table exp.Expression) *SelectDataset
- func (sd *SelectDataset) NaturalLeftJoin(table exp.Expression) *SelectDataset
- func (sd *SelectDataset) NaturalRightJoin(table exp.Expression) *SelectDataset
- func (sd *SelectDataset) Offset(offset uint) *SelectDataset
- func (sd *SelectDataset) Order(order ...exp.OrderedExpression) *SelectDataset
- func (sd *SelectDataset) OrderAppend(order ...exp.OrderedExpression) *SelectDataset
- func (sd *SelectDataset) OrderPrepend(order ...exp.OrderedExpression) *SelectDataset
- func (sd *SelectDataset) Pluck(v any, col string) error
- func (sd *SelectDataset) PluckContext(ctx context.Context, v any, col string) error
- func (sd *SelectDataset) Prepared(prepared bool) *SelectDataset
- func (sd *SelectDataset) QueryRow(v any) error
- func (sd *SelectDataset) QueryRowCtx(ctx context.Context, v any) error
- func (sd *SelectDataset) QueryRowPartial(v any) error
- func (sd *SelectDataset) QueryRowPartialCtx(ctx context.Context, v any) error
- func (sd *SelectDataset) QueryRows(v any) error
- func (sd *SelectDataset) QueryRowsCtx(ctx context.Context, v any) error
- func (sd *SelectDataset) QueryRowsPartial(v any) error
- func (sd *SelectDataset) QueryRowsPartialCtx(ctx context.Context, v any) error
- func (sd *SelectDataset) ReturnsColumns() bool
- func (sd *SelectDataset) RightJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
- func (sd *SelectDataset) RightOuterJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
- func (sd *SelectDataset) Select(selects ...any) *SelectDataset
- func (sd *SelectDataset) SelectAppend(selects ...any) *SelectDataset
- func (sd *SelectDataset) SelectDistinct(selects ...any) *SelectDatasetdeprecated
- func (sd *SelectDataset) SetDialect(dialect SQLDialect) *SelectDataset
- func (sd *SelectDataset) SetError(err error) *SelectDataset
- func (sd *SelectDataset) ToSQL() (sql string, params []any, err error)
- func (sd *SelectDataset) Truncate() *TruncateDataset
- func (sd *SelectDataset) Union(other *SelectDataset) *SelectDataset
- func (sd *SelectDataset) UnionAll(other *SelectDataset) *SelectDataset
- func (sd *SelectDataset) Update() *UpdateDataset
- func (sd *SelectDataset) Where(expressions ...exp.Expression) *SelectDataset
- func (sd *SelectDataset) Window(ws ...exp.WindowExpression) *SelectDataset
- func (sd *SelectDataset) WindowAppend(ws ...exp.WindowExpression) *SelectDataset
- func (sd *SelectDataset) With(name string, subquery exp.Expression) *SelectDataset
- func (sd *SelectDataset) WithDialect(dl string) *SelectDataset
- func (sd *SelectDataset) WithRecursive(name string, subquery exp.Expression) *SelectDataset
- type TruncateDataset
- func (td *TruncateDataset) Cascade() *TruncateDataset
- func (td *TruncateDataset) Clone() exp.Expression
- func (td *TruncateDataset) Dialect() SQLDialect
- func (td *TruncateDataset) Error() error
- func (td *TruncateDataset) Expression() exp.Expression
- func (td *TruncateDataset) GetClauses() exp.TruncateClauses
- func (td *TruncateDataset) Identity(identity string) *TruncateDataset
- func (td *TruncateDataset) IsPrepared() bool
- func (td *TruncateDataset) NoCascade() *TruncateDataset
- func (td *TruncateDataset) NoRestrict() *TruncateDataset
- func (td *TruncateDataset) Prepared(prepared bool) *TruncateDataset
- func (td *TruncateDataset) Restrict() *TruncateDataset
- func (td *TruncateDataset) SetDialect(dialect SQLDialect) *TruncateDataset
- func (td *TruncateDataset) SetError(err error) *TruncateDataset
- func (td *TruncateDataset) Table(table ...any) *TruncateDataset
- func (td *TruncateDataset) ToSQL() (sql string, params []any, err error)
- func (td *TruncateDataset) Truncate() (sql.Result, error)
- func (td *TruncateDataset) TruncateCtx(ctx context.Context) (sql.Result, error)
- func (td *TruncateDataset) WithDialect(dl string) *TruncateDataset
- type TruncateOptions
- type TxDatabase
- func (td *TxDatabase) Delete(table any) *DeleteDataset
- func (td *TxDatabase) Dialect() string
- func (td *TxDatabase) Exec(query string, args ...any) (sql.Result, error)
- func (td *TxDatabase) ExecCtx(ctx context.Context, query string, args ...any) (sql.Result, error)
- func (td *TxDatabase) From(cols ...any) *SelectDataset
- func (td *TxDatabase) Insert(table any) *InsertDataset
- func (td *TxDatabase) Logger(logger logx.Logger)
- func (td *TxDatabase) Prepare(query string) (sqlx.StmtSession, error)
- func (td *TxDatabase) PrepareCtx(ctx context.Context, query string) (sqlx.StmtSession, error)
- func (td *TxDatabase) QueryRow(v any, query string, args ...any) error
- func (td *TxDatabase) QueryRowCtx(ctx context.Context, v any, query string, args ...any) error
- func (td *TxDatabase) QueryRowPartial(v any, query string, args ...any) error
- func (td *TxDatabase) QueryRowPartialCtx(ctx context.Context, v any, query string, args ...any) error
- func (td *TxDatabase) QueryRows(v any, query string, args ...any) error
- func (td *TxDatabase) QueryRowsCtx(ctx context.Context, v any, query string, args ...any) error
- func (td *TxDatabase) QueryRowsPartial(v any, query string, args ...any) error
- func (td *TxDatabase) QueryRowsPartialCtx(ctx context.Context, v any, query string, args ...any) error
- func (td *TxDatabase) Select(cols ...any) *SelectDataset
- func (td *TxDatabase) Trace(ctx context.Context, op, sqlString string, args ...any)
- func (td *TxDatabase) Truncate(table ...any) *TruncateDataset
- func (td *TxDatabase) Update(table any) *UpdateDataset
- type UpdateDataset
- func (ud *UpdateDataset) AppendSQL(b sb.SQLBuilder)
- func (ud *UpdateDataset) ClearLimit() *UpdateDataset
- func (ud *UpdateDataset) ClearOrder() *UpdateDataset
- func (ud *UpdateDataset) ClearWhere() *UpdateDataset
- func (ud *UpdateDataset) Clone() exp.Expression
- func (ud *UpdateDataset) Dialect() SQLDialect
- func (ud *UpdateDataset) Error() error
- func (ud *UpdateDataset) Exec() (sql.Result, error)
- func (ud *UpdateDataset) ExecCtx(ctx context.Context) (sql.Result, error)
- func (ud *UpdateDataset) Expression() exp.Expression
- func (ud *UpdateDataset) From(tables ...any) *UpdateDataset
- func (ud *UpdateDataset) GetAs() exp.IdentifierExpression
- func (ud *UpdateDataset) GetClauses() exp.UpdateClauses
- func (ud *UpdateDataset) IsPrepared() bool
- func (ud *UpdateDataset) Limit(limit uint) *UpdateDataset
- func (ud *UpdateDataset) LimitAll() *UpdateDataset
- func (ud *UpdateDataset) Order(order ...exp.OrderedExpression) *UpdateDataset
- func (ud *UpdateDataset) OrderAppend(order ...exp.OrderedExpression) *UpdateDataset
- func (ud *UpdateDataset) OrderPrepend(order ...exp.OrderedExpression) *UpdateDataset
- func (ud *UpdateDataset) Prepared(prepared bool) *UpdateDataset
- func (ud *UpdateDataset) QueryRow(v any) error
- func (ud *UpdateDataset) QueryRowCtx(ctx context.Context, v any) error
- func (ud *UpdateDataset) QueryRowPartial(v any) error
- func (ud *UpdateDataset) QueryRowPartialCtx(ctx context.Context, v any) error
- func (ud *UpdateDataset) QueryRows(v any) error
- func (ud *UpdateDataset) QueryRowsCtx(ctx context.Context, v any) error
- func (ud *UpdateDataset) QueryRowsPartial(v any) error
- func (ud *UpdateDataset) QueryRowsPartialCtx(ctx context.Context, v any) error
- func (ud *UpdateDataset) Returning(returning ...any) *UpdateDataset
- func (ud *UpdateDataset) ReturnsColumns() bool
- func (ud *UpdateDataset) Set(values any) *UpdateDataset
- func (ud *UpdateDataset) SetDialect(dialect SQLDialect) *UpdateDataset
- func (ud *UpdateDataset) SetError(err error) *UpdateDataset
- func (ud *UpdateDataset) Table(table any) *UpdateDataset
- func (ud *UpdateDataset) ToSQL() (sql string, params []any, err error)
- func (ud *UpdateDataset) Where(expressions ...exp.Expression) *UpdateDataset
- func (ud *UpdateDataset) With(name string, subquery exp.Expression) *UpdateDataset
- func (ud *UpdateDataset) WithDialect(dl string) *UpdateDataset
- func (ud *UpdateDataset) WithRecursive(name string, subquery exp.Expression) *UpdateDataset
- type Vals
Examples ¶
- AVG
- AVG (As)
- AVG (HavingClause)
- All
- And
- And (WithExOr)
- And (WithOr)
- Any
- C
- C (As)
- C (BetweenComparisons)
- C (Cast)
- C (Comparisons)
- C (InOperators)
- C (IsComparisons)
- C (LikeComparisons)
- C (Ordering)
- COALESCE
- COALESCE (As)
- COUNT
- COUNT (As)
- COUNT (HavingClause)
- Case (Search)
- Case (SearchElse)
- Case (Value)
- Case (ValueElse)
- Cast
- DISTINCT
- DISTINCT (As)
- Database.Dialect
- Database.Exec
- Database.From
- Default
- Delete
- DeleteDataset.ClearLimit
- DeleteDataset.ClearOrder
- DeleteDataset.ClearWhere
- DeleteDataset.Limit
- DeleteDataset.LimitAll
- DeleteDataset.Order
- DeleteDataset.OrderAppend
- DeleteDataset.OrderPrepend
- DeleteDataset.Prepared
- DeleteDataset.Returning
- DeleteDataset.ToSQL
- DeleteDataset.Where
- DeleteDataset.Where (Prepared)
- DeleteDataset.With
- DeleteDataset.WithRecursive
- Dialect (DatasetMysql)
- Dialect (DatasetPostgres)
- Dialect (DatasetSqlite3)
- Dialect (DbMysql)
- Dialect (DbPostgres)
- Dialect (DbSqlite3)
- DoNothing
- DoUpdate
- DoUpdate (Where)
- Ex
- Ex (In)
- Ex (WithOp)
- ExOr
- ExOr (WithOp)
- FIRST
- FIRST (As)
- From
- Func
- I
- Insert (BuilderRecord)
- Insert (ColsAndVals)
- Insert (FromQuery)
- Insert (FromQueryWithCols)
- Insert (Map)
- Insert (Prepared)
- Insert (Struct)
- InsertDataset.ClearCols
- InsertDataset.ClearOnConflict
- InsertDataset.ClearRows
- InsertDataset.ClearVals
- InsertDataset.Cols
- InsertDataset.Cols (WithFromQuery)
- InsertDataset.ColsAppend
- InsertDataset.FromQuery
- InsertDataset.Into
- InsertDataset.Into (Aliased)
- InsertDataset.OnConflict (DoNothing)
- InsertDataset.OnConflict (DoUpdate)
- InsertDataset.OnConflict (DoUpdateWithWhere)
- InsertDataset.Prepared
- InsertDataset.Returning
- InsertDataset.Rows (WithEmbeddedStruct)
- InsertDataset.Rows (WithIgnoredEmbedded)
- InsertDataset.Rows (WithNilEmbeddedPointer)
- InsertDataset.Rows (WithNoDbTag)
- InsertDataset.Rows (WithbuilderDefaultIfEmptyTag)
- InsertDataset.Rows (WithbuilderSkipInsertTag)
- InsertDataset.ToSQL
- InsertDataset.Vals
- InsertDataset.With
- InsertDataset.WithRecursive
- L
- L (As)
- L (BetweenComparisons)
- L (Comparisons)
- L (InOperators)
- L (IsComparisons)
- L (LikeComparisons)
- L (WithArgs)
- LAST
- LAST (As)
- Lateral
- Lateral (Join)
- MAX
- MAX (As)
- MAX (HavingClause)
- MIN
- MIN (As)
- MIN (HavingClause)
- On
- On (WithEx)
- Op (BetweenComparisons)
- Op (Comparisons)
- Op (InComparisons)
- Op (IsComparisons)
- Op (LikeComparisons)
- Op (WithMultipleKeys)
- Or
- Or (WithAnd)
- Or (WithExMap)
- Range (Identifiers)
- Range (Numbers)
- Range (Strings)
- Record (Insert)
- Record (Update)
- RegisterDialect
- S
- SUM
- SUM (As)
- SUM (HavingClause)
- Select
- SelectDataset
- SelectDataset.As
- SelectDataset.ClearLimit
- SelectDataset.ClearOffset
- SelectDataset.ClearOrder
- SelectDataset.ClearSelect
- SelectDataset.ClearWhere
- SelectDataset.Count
- SelectDataset.CrossJoin
- SelectDataset.Delete
- SelectDataset.Distinct
- SelectDataset.Distinct (On)
- SelectDataset.Distinct (OnCoalesce)
- SelectDataset.Distinct (OnWithLiteral)
- SelectDataset.From
- SelectDataset.From (WithAliasedDataset)
- SelectDataset.From (WithDataset)
- SelectDataset.FromSelf
- SelectDataset.FullJoin
- SelectDataset.FullOuterJoin
- SelectDataset.GroupBy
- SelectDataset.GroupByAppend
- SelectDataset.Having
- SelectDataset.InnerJoin
- SelectDataset.Insert
- SelectDataset.Intersect
- SelectDataset.IntersectAll
- SelectDataset.Join
- SelectDataset.LeftJoin
- SelectDataset.LeftOuterJoin
- SelectDataset.Limit
- SelectDataset.LimitAll
- SelectDataset.NaturalFullJoin
- SelectDataset.NaturalJoin
- SelectDataset.NaturalLeftJoin
- SelectDataset.NaturalRightJoin
- SelectDataset.Offset
- SelectDataset.Order
- SelectDataset.Order (CaseExpression)
- SelectDataset.OrderAppend
- SelectDataset.OrderPrepend
- SelectDataset.Pluck
- SelectDataset.Prepared
- SelectDataset.QueryRow
- SelectDataset.QueryRow (WithJoinAutoSelect)
- SelectDataset.QueryRowPartial
- SelectDataset.QueryRows
- SelectDataset.QueryRows (Prepared)
- SelectDataset.QueryRows (WithJoinAutoSelect)
- SelectDataset.QueryRowsPartial
- SelectDataset.RightJoin
- SelectDataset.RightOuterJoin
- SelectDataset.Select
- SelectDataset.Select (WithAliasedDataset)
- SelectDataset.Select (WithDataset)
- SelectDataset.Select (WithLiteral)
- SelectDataset.Select (WithSQLFunctionExpression)
- SelectDataset.Select (WithStruct)
- SelectDataset.SelectAppend
- SelectDataset.ToSQL
- SelectDataset.ToSQL (Prepared)
- SelectDataset.Truncate
- SelectDataset.Union
- SelectDataset.UnionAll
- SelectDataset.Update
- SelectDataset.Where
- SelectDataset.Where (Prepared)
- SelectDataset.Window
- SelectDataset.With
- SelectDataset.With (DeleteDataset)
- SelectDataset.With (InsertDataset)
- SelectDataset.With (UpdateDataset)
- SelectDataset.WithRecursive
- SetTimeLocation
- Star
- T
- Update (WithMap)
- Update (WithSkipUpdateTag)
- Update (WithStruct)
- Update (WithbuilderRecord)
- UpdateDataset.ClearLimit
- UpdateDataset.ClearOrder
- UpdateDataset.ClearWhere
- UpdateDataset.Exec
- UpdateDataset.From
- UpdateDataset.From (Mysql)
- UpdateDataset.From (Postgres)
- UpdateDataset.Limit
- UpdateDataset.LimitAll
- UpdateDataset.Order
- UpdateDataset.OrderAppend
- UpdateDataset.OrderPrepend
- UpdateDataset.Prepared
- UpdateDataset.Set
- UpdateDataset.Set (BuilderRecord)
- UpdateDataset.Set (Map)
- UpdateDataset.Set (Struct)
- UpdateDataset.Set (WithDefaultIfEmptyTag)
- UpdateDataset.Set (WithEmbeddedStruct)
- UpdateDataset.Set (WithIgnoredEmbedded)
- UpdateDataset.Set (WithNilEmbeddedPointer)
- UpdateDataset.Set (WithNoTags)
- UpdateDataset.Set (WithSkipUpdateTag)
- UpdateDataset.Table
- UpdateDataset.Table (Aliased)
- UpdateDataset.ToSQL
- UpdateDataset.ToSQL (Prepared)
- UpdateDataset.Where
- UpdateDataset.Where (Prepared)
- UpdateDataset.With
- UpdateDataset.WithRecursive
- Using
- Using (WithIdentifier)
- V
- V (Prepared)
- Vals
- W
Constants ¶
const ( Wait = exp.Wait NoWait = exp.NoWait SkipLocked = exp.SkipLocked )
Variables ¶
var (
DefaultDialectOptions = sqlgen.DefaultDialectOptions
)
var ErrBadFromArgument = errors.New(
"unsupported DeleteDataset#From argument, a string or ddentifier expression is required",
)
var ErrExecutorNotFoundError = errors.New(
"unable to execute query did you use builder.Database#From to create the dataset",
)
var ErrUnsupportedIntoType = errors.New("unsupported table type, a string or identifier expression is required")
var ErrUnsupportedUpdateTableType = errors.New("unsupported table type, a string or identifier expression is required")
Functions ¶
func AVG ¶
func AVG(col any) exp.SQLFunctionExpression
Creates a new AVG sql function
AVG("a") -> AVG("a")
AVG(I("a")) -> AVG("a")
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(builder.AVG("col"))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT AVG("col") FROM "test" [] SELECT AVG("col") FROM "test" []
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.AVG("a").As("a")).ToSQL()
fmt.Println(sql)
}
Output: SELECT AVG("a") AS "a" FROM "test"
Example (HavingClause) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.
From("test").
Select(builder.AVG("a").As("avg")).
GroupBy("a").
Having(builder.AVG("a").Gt(10))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT AVG("a") AS "avg" FROM "test" GROUP BY "a" HAVING (AVG("a") > 10) [] SELECT AVG("a") AS "avg" FROM "test" GROUP BY "a" HAVING (AVG("a") > ?) [10]
func All ¶
func All(val any) exp.SQLFunctionExpression
Create a new ALL comparison
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(builder.Ex{
"id": builder.All(builder.From("other").Select("test_id")),
})
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("id" = ALL ((SELECT "test_id" FROM "other"))) [] SELECT * FROM "test" WHERE ("id" = ALL ((SELECT "test_id" FROM "other"))) []
func And ¶
func And(expressions ...exp.Expression) exp.ExpressionList
A list of expressions that should be ANDed together
And(I("a").Eq(10), I("b").Eq(11)) //(("a" = 10) AND ("b" = 11))
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.And(
builder.C("col").Gt(10),
builder.C("col").Lt(20),
),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (("col" > 10) AND ("col" < 20)) [] SELECT * FROM "test" WHERE (("col" > ?) AND ("col" < ?)) [10 20]
Example (WithExOr) ¶
You can use ExOr inside of And expression lists.
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// by default expressions are anded together
ds := builder.From("test").Where(
builder.C("col1").IsTrue(),
builder.ExOr{
"col2": builder.Op{"gt": 10},
"col3": builder.Op{"lt": 20},
},
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (("col1" IS TRUE) AND (("col2" > 10) OR ("col3" < 20))) [] SELECT * FROM "test" WHERE (("col1" IS TRUE) AND (("col2" > ?) OR ("col3" < ?))) [10 20]
Example (WithOr) ¶
You can use And with Or to create more complex queries
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.And(
builder.C("col1").IsTrue(),
builder.Or(
builder.C("col2").Gt(10),
builder.C("col2").Lt(20),
),
),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
// by default expressions are anded together
ds = builder.From("test").Where(
builder.C("col1").IsTrue(),
builder.Or(
builder.C("col2").Gt(10),
builder.C("col2").Lt(20),
),
)
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (("col1" IS TRUE) AND (("col2" > 10) OR ("col2" < 20))) [] SELECT * FROM "test" WHERE (("col1" IS TRUE) AND (("col2" > ?) OR ("col2" < ?))) [10 20] SELECT * FROM "test" WHERE (("col1" IS TRUE) AND (("col2" > 10) OR ("col2" < 20))) [] SELECT * FROM "test" WHERE (("col1" IS TRUE) AND (("col2" > ?) OR ("col2" < ?))) [10 20]
func Any ¶
func Any(val any) exp.SQLFunctionExpression
Create a new ANY comparison
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(builder.Ex{
"id": builder.Any(builder.From("other").Select("test_id")),
})
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("id" = ANY ((SELECT "test_id" FROM "other"))) [] SELECT * FROM "test" WHERE ("id" = ANY ((SELECT "test_id" FROM "other"))) []
func C ¶
func C(col string) exp.IdentifierExpression
Creates a new Column Identifier, the generated sql will use adapter specific quoting or '"' by default, this ensures case sensitivity and in certain databases allows for special characters, (e.g. "curr-table", "my table"). An Identifier can represent a one or a combination of schema, table, and/or column.
C("column") -> "column" //A Column
C("column").Table("table") -> "table"."column" //A Column and table
C("column").Table("table").Schema("schema") //Schema table and column
C("*") //Also handles the * operator
Example ¶
package main
import (
"fmt"
"regexp"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("test").
Select(builder.C("*")).
ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").
Select(builder.C("col1")).
ToSQL()
fmt.Println(sql, args)
ds := builder.From("test").Where(
builder.C("col1").Eq(10),
builder.C("col2").In([]int64{1, 2, 3, 4}),
builder.C("col3").Like(regexp.MustCompile("^[ab]")),
builder.C("col4").IsNull(),
)
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" [] SELECT "col1" FROM "test" [] SELECT * FROM "test" WHERE (("col1" = 10) AND ("col2" IN (1, 2, 3, 4)) AND ("col3" ~ '^[ab]') AND ("col4" IS NULL)) [] SELECT * FROM "test" WHERE (("col1" = ?) AND ("col2" IN (?, ?, ?, ?)) AND ("col3" ~ ?) AND ("col4" IS NULL)) [10 1 2 3 4 ^[ab]]
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.C("a").As("as_a")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Select(builder.C("a").As(builder.C("as_a"))).ToSQL()
fmt.Println(sql)
}
Output: SELECT "a" AS "as_a" FROM "test" SELECT "a" AS "as_a" FROM "test"
Example (BetweenComparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.C("a").Between(builder.Range(1, 10)),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(
builder.C("a").NotBetween(builder.Range(1, 10)),
)
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("a" BETWEEN 1 AND 10) [] SELECT * FROM "test" WHERE ("a" BETWEEN ? AND ?) [1 10] SELECT * FROM "test" WHERE ("a" NOT BETWEEN 1 AND 10) [] SELECT * FROM "test" WHERE ("a" NOT BETWEEN ? AND ?) [1 10]
Example (Cast) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").
Select(builder.C("json1").Cast("TEXT").As("json_text")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(
builder.C("json1").Cast("TEXT").Neq(
builder.C("json2").Cast("TEXT"),
),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT CAST("json1" AS TEXT) AS "json_text" FROM "test" SELECT * FROM "test" WHERE (CAST("json1" AS TEXT) != CAST("json2" AS TEXT))
Example (Comparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// used from an identifier
sql, _, _ := builder.From("test").Where(builder.C("a").Eq(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").Neq(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").Gt(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").Gte(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").Lt(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").Lte(10)).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" WHERE ("a" = 10) SELECT * FROM "test" WHERE ("a" != 10) SELECT * FROM "test" WHERE ("a" > 10) SELECT * FROM "test" WHERE ("a" >= 10) SELECT * FROM "test" WHERE ("a" < 10) SELECT * FROM "test" WHERE ("a" <= 10)
Example (InOperators) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// using identifiers
sql, _, _ := builder.From("test").Where(builder.C("a").In("a", "b", "c")).ToSQL()
fmt.Println(sql)
// with a slice
sql, _, _ = builder.From("test").Where(builder.C("a").In([]string{"a", "b", "c"})).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").NotIn("a", "b", "c")).ToSQL()
fmt.Println(sql)
// with a slice
sql, _, _ = builder.From("test").Where(builder.C("a").NotIn([]string{"a", "b", "c"})).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" WHERE ("a" IN ('a', 'b', 'c')) SELECT * FROM "test" WHERE ("a" IN ('a', 'b', 'c')) SELECT * FROM "test" WHERE ("a" NOT IN ('a', 'b', 'c')) SELECT * FROM "test" WHERE ("a" NOT IN ('a', 'b', 'c'))
Example (IsComparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("test").Where(builder.C("a").Is(nil)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").Is(true)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").Is(false)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").IsNull()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").IsTrue()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").IsFalse()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").IsNot(nil)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").IsNot(true)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").IsNot(false)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").IsNotNull()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").IsNotTrue()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.C("a").IsNotFalse()).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("a" IS NULL) [] SELECT * FROM "test" WHERE ("a" IS TRUE) [] SELECT * FROM "test" WHERE ("a" IS FALSE) [] SELECT * FROM "test" WHERE ("a" IS NULL) [] SELECT * FROM "test" WHERE ("a" IS TRUE) [] SELECT * FROM "test" WHERE ("a" IS FALSE) [] SELECT * FROM "test" WHERE ("a" IS NOT NULL) [] SELECT * FROM "test" WHERE ("a" IS NOT TRUE) [] SELECT * FROM "test" WHERE ("a" IS NOT FALSE) [] SELECT * FROM "test" WHERE ("a" IS NOT NULL) [] SELECT * FROM "test" WHERE ("a" IS NOT TRUE) [] SELECT * FROM "test" WHERE ("a" IS NOT FALSE) []
Example (LikeComparisons) ¶
package main
import (
"fmt"
"regexp"
"github.com/Tooooommy/builder/v9"
)
func main() {
// using identifiers
sql, _, _ := builder.From("test").Where(builder.C("a").Like("%a%")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").Like(regexp.MustCompile(`[ab]`))).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").ILike("%a%")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").ILike(regexp.MustCompile("[ab]"))).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").NotLike("%a%")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").NotLike(regexp.MustCompile("[ab]"))).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").NotILike("%a%")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.C("a").NotILike(regexp.MustCompile(`[ab]`))).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" WHERE ("a" LIKE '%a%') SELECT * FROM "test" WHERE ("a" ~ '[ab]') SELECT * FROM "test" WHERE ("a" ILIKE '%a%') SELECT * FROM "test" WHERE ("a" ~* '[ab]') SELECT * FROM "test" WHERE ("a" NOT LIKE '%a%') SELECT * FROM "test" WHERE ("a" !~ '[ab]') SELECT * FROM "test" WHERE ("a" NOT ILIKE '%a%') SELECT * FROM "test" WHERE ("a" !~* '[ab]')
Example (Ordering) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("test").Order(builder.C("a").Asc()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Order(builder.C("a").Asc().NullsFirst()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Order(builder.C("a").Asc().NullsLast()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Order(builder.C("a").Desc()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Order(builder.C("a").Desc().NullsFirst()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Order(builder.C("a").Desc().NullsLast()).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" ORDER BY "a" ASC [] SELECT * FROM "test" ORDER BY "a" ASC NULLS FIRST [] SELECT * FROM "test" ORDER BY "a" ASC NULLS LAST [] SELECT * FROM "test" ORDER BY "a" DESC [] SELECT * FROM "test" ORDER BY "a" DESC NULLS FIRST [] SELECT * FROM "test" ORDER BY "a" DESC NULLS LAST []
func COALESCE ¶
func COALESCE(vals ...any) exp.SQLFunctionExpression
Creates a new COALESCE sql function
COALESCE(I("a"), "a") -> COALESCE("a", 'a')
COALESCE(I("a"), I("b"), nil) -> COALESCE("a", "b", NULL)
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(
builder.COALESCE(builder.C("a"), "a"),
builder.COALESCE(builder.C("a"), builder.C("b"), nil),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT COALESCE("a", 'a'), COALESCE("a", "b", NULL) FROM "test" [] SELECT COALESCE("a", ?), COALESCE("a", "b", ?) FROM "test" [a <nil>]
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.COALESCE(builder.C("a"), "a").As("a")).ToSQL()
fmt.Println(sql)
}
Output: SELECT COALESCE("a", 'a') AS "a" FROM "test"
func COUNT ¶
func COUNT(col any) exp.SQLFunctionExpression
Creates a new COUNT sql function
COUNT("a") -> COUNT("a")
COUNT("*") -> COUNT("*")
COUNT(I("a")) -> COUNT("a")
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(builder.COUNT("*"))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT COUNT(*) FROM "test" [] SELECT COUNT(*) FROM "test" []
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.COUNT("*").As("count")).ToSQL()
fmt.Println(sql)
}
Output: SELECT COUNT(*) AS "count" FROM "test"
Example (HavingClause) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.
From("test").
Select(builder.COUNT("a").As("COUNT")).
GroupBy("a").
Having(builder.COUNT("a").Gt(10))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT COUNT("a") AS "COUNT" FROM "test" GROUP BY "a" HAVING (COUNT("a") > 10) [] SELECT COUNT("a") AS "COUNT" FROM "test" GROUP BY "a" HAVING (COUNT("a") > ?) [10]
func CUME_DIST ¶
func CUME_DIST() exp.SQLFunctionExpression
func Case ¶
func Case() exp.CaseExpression
Example (Search) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Select(
builder.C("col"),
builder.Case().
When(builder.C("col").Gt(0), true).
When(builder.C("col").Lte(0), false).
As("is_gt_zero"),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT "col", CASE WHEN ("col" > 0) THEN TRUE WHEN ("col" <= 0) THEN FALSE END AS "is_gt_zero" FROM "test" [] SELECT "col", CASE WHEN ("col" > ?) THEN ? WHEN ("col" <= ?) THEN ? END AS "is_gt_zero" FROM "test" [0 true 0 false]
Example (SearchElse) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Select(
builder.C("col"),
builder.Case().
When(builder.C("col").Gt(10), "Gt 10").
When(builder.C("col").Gt(20), "Gt 20").
Else("Bad Val").
As("str_val"),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT "col", CASE WHEN ("col" > 10) THEN 'Gt 10' WHEN ("col" > 20) THEN 'Gt 20' ELSE 'Bad Val' END AS "str_val" FROM "test" [] SELECT "col", CASE WHEN ("col" > ?) THEN ? WHEN ("col" > ?) THEN ? ELSE ? END AS "str_val" FROM "test" [10 Gt 10 20 Gt 20 Bad Val]
Example (Value) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Select(
builder.C("col"),
builder.Case().
Value(builder.C("str")).
When("foo", "FOO").
When("bar", "BAR").
As("foo_bar_upper"),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT "col", CASE "str" WHEN 'foo' THEN 'FOO' WHEN 'bar' THEN 'BAR' END AS "foo_bar_upper" FROM "test" [] SELECT "col", CASE "str" WHEN ? THEN ? WHEN ? THEN ? END AS "foo_bar_upper" FROM "test" [foo FOO bar BAR]
Example (ValueElse) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Select(
builder.C("col"),
builder.Case().
Value(builder.C("str")).
When("foo", "FOO").
When("bar", "BAR").
Else("Baz").
As("foo_bar_upper"),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT "col", CASE "str" WHEN 'foo' THEN 'FOO' WHEN 'bar' THEN 'BAR' ELSE 'Baz' END AS "foo_bar_upper" FROM "test" [] SELECT "col", CASE "str" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "foo_bar_upper" FROM "test" [foo FOO bar BAR Baz]
func Cast ¶
func Cast(e exp.Expression, t string) exp.CastExpression
Creates a new Casted expression
Cast(I("a"), "NUMERIC") -> CAST("a" AS NUMERIC)
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").
Select(builder.Cast(builder.C("json1"), "TEXT").As("json_text")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(
builder.Cast(builder.C("json1"), "TEXT").Neq(
builder.Cast(builder.C("json2"), "TEXT"),
),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT CAST("json1" AS TEXT) AS "json_text" FROM "test" SELECT * FROM "test" WHERE (CAST("json1" AS TEXT) != CAST("json2" AS TEXT))
func DENSE_RANK ¶
func DENSE_RANK() exp.SQLFunctionExpression
func DISTINCT ¶
func DISTINCT(col any) exp.SQLFunctionExpression
Creates a new DISTINCT sql function
DISTINCT("a") -> DISTINCT("a")
DISTINCT(I("a")) -> DISTINCT("a")
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(builder.DISTINCT("col"))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT DISTINCT("col") FROM "test" [] SELECT DISTINCT("col") FROM "test" []
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.DISTINCT("a").As("distinct_a")).ToSQL()
fmt.Println(sql)
}
Output: SELECT DISTINCT("a") AS "distinct_a" FROM "test"
func Default ¶
func Default() exp.LiteralExpression
Returns a literal for DEFAULT sql keyword
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.Insert("items")
sql, args, _ := ds.Rows(builder.Record{
"name": builder.Default(),
"address": builder.Default(),
}).ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).Rows(builder.Record{
"name": builder.Default(),
"address": builder.Default(),
}).ToSQL()
fmt.Println(sql, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES (DEFAULT, DEFAULT) [] INSERT INTO "items" ("address", "name") VALUES (DEFAULT, DEFAULT) []
func DeregisterDialect ¶
func DeregisterDialect(name string)
func DoNothing ¶
func DoNothing() exp.ConflictExpression
Creates a conflict struct to be passed to InsertConflict to ignore constraint errors
InsertConflict(DoNothing(),...) -> INSERT INTO ... ON CONFLICT DO NOTHING
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.Insert("items")
sql, args, _ := ds.Rows(builder.Record{
"address": "111 Address",
"name": "bob",
}).OnConflict(builder.DoNothing()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).Rows(builder.Record{
"address": "111 Address",
"name": "bob",
}).OnConflict(builder.DoNothing()).ToSQL()
fmt.Println(sql, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES ('111 Address', 'bob') ON CONFLICT DO NOTHING [] INSERT INTO "items" ("address", "name") VALUES (?, ?) ON CONFLICT DO NOTHING [111 Address bob]
func DoUpdate ¶
func DoUpdate(target string, update any) exp.ConflictUpdateExpression
Creates a ConflictUpdate struct to be passed to InsertConflict Represents a ON CONFLICT DO UPDATE portion of an INSERT statement (ON DUPLICATE KEY UPDATE for mysql)
InsertConflict(DoUpdate("target_column", update),...) ->
INSERT INTO ... ON CONFLICT DO UPDATE SET a=b
InsertConflict(DoUpdate("target_column", update).Where(Ex{"a": 1},...) ->
INSERT INTO ... ON CONFLICT DO UPDATE SET a=b WHERE a=1
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.Insert("items")
sql, args, _ := ds.
Rows(builder.Record{"address": "111 Address"}).
OnConflict(builder.DoUpdate("address", builder.C("address").Set(builder.I("excluded.address")))).
ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).
Rows(builder.Record{"address": "111 Address"}).
OnConflict(builder.DoUpdate("address", builder.C("address").Set(builder.I("excluded.address")))).
ToSQL()
fmt.Println(sql, args)
}
Output: INSERT INTO "items" ("address") VALUES ('111 Address') ON CONFLICT (address) DO UPDATE SET "address"="excluded"."address" [] INSERT INTO "items" ("address") VALUES (?) ON CONFLICT (address) DO UPDATE SET "address"="excluded"."address" [111 Address]
Example (Where) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.Insert("items")
sql, args, _ := ds.
Rows(builder.Record{"address": "111 Address"}).
OnConflict(builder.DoUpdate(
"address",
builder.C("address").Set(builder.I("excluded.address"))).Where(builder.I("items.updated").IsNull()),
).
ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).
Rows(builder.Record{"address": "111 Address"}).
OnConflict(builder.DoUpdate(
"address",
builder.C("address").Set(builder.I("excluded.address"))).Where(builder.I("items.updated").IsNull()),
).
ToSQL()
fmt.Println(sql, args)
}
Output: INSERT INTO "items" ("address") VALUES ('111 Address') ON CONFLICT (address) DO UPDATE SET "address"="excluded"."address" WHERE ("items"."updated" IS NULL) [] INSERT INTO "items" ("address") VALUES (?) ON CONFLICT (address) DO UPDATE SET "address"="excluded"."address" WHERE ("items"."updated" IS NULL) [111 Address]
func FIRST ¶
func FIRST(col any) exp.SQLFunctionExpression
Creates a new FIRST sql function
FIRST("a") -> FIRST("a")
FIRST(I("a")) -> FIRST("a")
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(builder.FIRST("col"))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT FIRST("col") FROM "test" [] SELECT FIRST("col") FROM "test" []
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.FIRST("a").As("a")).ToSQL()
fmt.Println(sql)
}
Output: SELECT FIRST("a") AS "a" FROM "test"
func FIRST_VALUE ¶
func FIRST_VALUE(val any) exp.SQLFunctionExpression
func Func ¶
func Func(name string, args ...any) exp.SQLFunctionExpression
Creates a new SQLFunctionExpression with the given name and arguments
Example ¶
This example shows how to create custom SQL Functions
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
"github.com/Tooooommy/builder/v9/exp"
)
func main() {
stragg := func(expression exp.Expression, delimiter string) exp.SQLFunctionExpression {
return builder.Func("str_agg", expression, builder.L(delimiter))
}
sql, _, _ := builder.From("test").Select(stragg(builder.C("col"), "|")).ToSQL()
fmt.Println(sql)
}
Output: SELECT str_agg("col", |) FROM "test"
func I ¶
func I(ident string) exp.IdentifierExpression
Creates a new Identifier, the generated sql will use adapter specific quoting or '"' by default, this ensures case sensitivity and in certain databases allows for special characters, (e.g. "curr-table", "my table").
The identifier will be split by '.'
Table and Column example
I("table.column") -> "table"."column" //A Column and table
Schema table and column
I("schema.table.column") -> "schema"."table"."column"
Table with star
I("table.*") -> "table".*
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Select(
builder.I("my_schema.table.col1"),
builder.I("table.col2"),
builder.I("col3"),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Select(builder.I("test.*"))
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT "my_schema"."table"."col1", "table"."col2", "col3" FROM "test" [] SELECT "my_schema"."table"."col1", "table"."col2", "col3" FROM "test" [] SELECT "test".* FROM "test" [] SELECT "test".* FROM "test" []
func L ¶
func L(sql string, args ...any) exp.LiteralExpression
Creates a new SQL literal with the provided arguments.
L("a = 1") -> a = 1
You can also you placeholders. All placeholders within a Literal are represented by '?'
L("a = ?", "b") -> a = 'b'
Literals can also contain placeholders for other expressions
L("(? AND ?) OR (?)", I("a").Eq(1), I("b").Eq("b"), I("c").In([]string{"a", "b", "c"}))
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
// literal with no args
builder.L(`"col"::TEXT = ""other_col"::text`),
// literal with args they will be interpolated into the sql by default
builder.L("col IN (?, ?, ?)", "a", "b", "c"),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("col"::TEXT = ""other_col"::text AND col IN ('a', 'b', 'c')) [] SELECT * FROM "test" WHERE ("col"::TEXT = ""other_col"::text AND col IN (?, ?, ?)) [a b c]
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.L("json_col->>'totalAmount'").As("total_amount")).ToSQL()
fmt.Println(sql)
}
Output: SELECT json_col->>'totalAmount' AS "total_amount" FROM "test"
Example (BetweenComparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.L("(a + b)").Between(builder.Range(1, 10)),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(
builder.L("(a + b)").NotBetween(builder.Range(1, 10)),
)
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ((a + b) BETWEEN 1 AND 10) [] SELECT * FROM "test" WHERE ((a + b) BETWEEN ? AND ?) [1 10] SELECT * FROM "test" WHERE ((a + b) NOT BETWEEN 1 AND 10) [] SELECT * FROM "test" WHERE ((a + b) NOT BETWEEN ? AND ?) [1 10]
Example (Comparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// used from a literal expression
sql, _, _ := builder.From("test").Where(builder.L("(a + b)").Eq(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.L("(a + b)").Neq(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.L("(a + b)").Gt(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.L("(a + b)").Gte(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.L("(a + b)").Lt(10)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.L("(a + b)").Lte(10)).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" WHERE ((a + b) = 10) SELECT * FROM "test" WHERE ((a + b) != 10) SELECT * FROM "test" WHERE ((a + b) > 10) SELECT * FROM "test" WHERE ((a + b) >= 10) SELECT * FROM "test" WHERE ((a + b) < 10) SELECT * FROM "test" WHERE ((a + b) <= 10)
Example (InOperators) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// using identifiers
sql, _, _ := builder.From("test").Where(builder.L("json_col->>'val'").In("a", "b", "c")).ToSQL()
fmt.Println(sql)
// with a slice
sql, _, _ = builder.From("test").Where(builder.L("json_col->>'val'").In([]string{"a", "b", "c"})).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.L("json_col->>'val'").NotIn("a", "b", "c")).ToSQL()
fmt.Println(sql)
// with a slice
sql, _, _ = builder.From("test").Where(builder.L("json_col->>'val'").NotIn([]string{"a", "b", "c"})).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" WHERE (json_col->>'val' IN ('a', 'b', 'c')) SELECT * FROM "test" WHERE (json_col->>'val' IN ('a', 'b', 'c')) SELECT * FROM "test" WHERE (json_col->>'val' NOT IN ('a', 'b', 'c')) SELECT * FROM "test" WHERE (json_col->>'val' NOT IN ('a', 'b', 'c'))
Example (IsComparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("test").Where(builder.L("a").Is(nil)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").Is(true)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").Is(false)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").IsNull()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").IsTrue()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").IsFalse()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").IsNot(nil)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").IsNot(true)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").IsNot(false)).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").IsNotNull()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").IsNotTrue()).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("test").Where(builder.L("a").IsNotFalse()).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (a IS NULL) [] SELECT * FROM "test" WHERE (a IS TRUE) [] SELECT * FROM "test" WHERE (a IS FALSE) [] SELECT * FROM "test" WHERE (a IS NULL) [] SELECT * FROM "test" WHERE (a IS TRUE) [] SELECT * FROM "test" WHERE (a IS FALSE) [] SELECT * FROM "test" WHERE (a IS NOT NULL) [] SELECT * FROM "test" WHERE (a IS NOT TRUE) [] SELECT * FROM "test" WHERE (a IS NOT FALSE) [] SELECT * FROM "test" WHERE (a IS NOT NULL) [] SELECT * FROM "test" WHERE (a IS NOT TRUE) [] SELECT * FROM "test" WHERE (a IS NOT FALSE) []
Example (LikeComparisons) ¶
package main
import (
"fmt"
"regexp"
"github.com/Tooooommy/builder/v9"
)
func main() {
// using identifiers
sql, _, _ := builder.From("test").Where(builder.L("(a::text || 'bar')").Like("%a%")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(
builder.L("(a::text || 'bar')").Like(regexp.MustCompile("[ab]")),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.L("(a::text || 'bar')").ILike("%a%")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(
builder.L("(a::text || 'bar')").ILike(regexp.MustCompile("[ab]")),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.L("(a::text || 'bar')").NotLike("%a%")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(
builder.L("(a::text || 'bar')").NotLike(regexp.MustCompile("[ab]")),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(builder.L("(a::text || 'bar')").NotILike("%a%")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Where(
builder.L("(a::text || 'bar')").NotILike(regexp.MustCompile("[ab]")),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" WHERE ((a::text || 'bar') LIKE '%a%') SELECT * FROM "test" WHERE ((a::text || 'bar') ~ '[ab]') SELECT * FROM "test" WHERE ((a::text || 'bar') ILIKE '%a%') SELECT * FROM "test" WHERE ((a::text || 'bar') ~* '[ab]') SELECT * FROM "test" WHERE ((a::text || 'bar') NOT LIKE '%a%') SELECT * FROM "test" WHERE ((a::text || 'bar') !~ '[ab]') SELECT * FROM "test" WHERE ((a::text || 'bar') NOT ILIKE '%a%') SELECT * FROM "test" WHERE ((a::text || 'bar') !~* '[ab]')
Example (WithArgs) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.L(
"(? AND ?) OR ?",
builder.C("a").Eq(1),
builder.C("b").Eq("b"),
builder.C("c").In([]string{"a", "b", "c"}),
),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (("a" = 1) AND ("b" = 'b')) OR ("c" IN ('a', 'b', 'c')) [] SELECT * FROM "test" WHERE (("a" = ?) AND ("b" = ?)) OR ("c" IN (?, ?, ?)) [1 b a b c]
func LAST ¶
func LAST(col any) exp.SQLFunctionExpression
Creates a new LAST sql function
LAST("a") -> LAST("a")
LAST(I("a")) -> LAST("a")
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(builder.LAST("col"))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT LAST("col") FROM "test" [] SELECT LAST("col") FROM "test" []
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.LAST("a").As("a")).ToSQL()
fmt.Println(sql)
}
Output: SELECT LAST("a") AS "a" FROM "test"
func LAST_VALUE ¶
func LAST_VALUE(val any) exp.SQLFunctionExpression
func Lateral ¶
func Lateral(table exp.AppendableExpression) exp.LateralExpression
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
maxEntry := builder.From("entry").
Select(builder.MAX("int").As("max_int")).
Where(builder.Ex{"time": builder.Op{"lt": builder.I("e.time")}}).
As("max_entry")
maxID := builder.From("entry").
Select("id").
Where(builder.Ex{"int": builder.I("max_entry.max_int")}).
As("max_id")
ds := builder.
Select("e.id", "max_entry.max_int", "max_id.id").
From(
builder.T("entry").As("e"),
builder.Lateral(maxEntry),
builder.Lateral(maxID),
)
query, args, _ := ds.ToSQL()
fmt.Println(query, args)
query, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(query, args)
}
Output: SELECT "e"."id", "max_entry"."max_int", "max_id"."id" FROM "entry" AS "e", LATERAL (SELECT MAX("int") AS "max_int" FROM "entry" WHERE ("time" < "e"."time")) AS "max_entry", LATERAL (SELECT "id" FROM "entry" WHERE ("int" = "max_entry"."max_int")) AS "max_id" [] SELECT "e"."id", "max_entry"."max_int", "max_id"."id" FROM "entry" AS "e", LATERAL (SELECT MAX("int") AS "max_int" FROM "entry" WHERE ("time" < "e"."time")) AS "max_entry", LATERAL (SELECT "id" FROM "entry" WHERE ("int" = "max_entry"."max_int")) AS "max_id" []
Example (Join) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
maxEntry := builder.From("entry").
Select(builder.MAX("int").As("max_int")).
Where(builder.Ex{"time": builder.Op{"lt": builder.I("e.time")}}).
As("max_entry")
maxID := builder.From("entry").
Select("id").
Where(builder.Ex{"int": builder.I("max_entry.max_int")}).
As("max_id")
ds := builder.
Select("e.id", "max_entry.max_int", "max_id.id").
From(builder.T("entry").As("e")).
Join(builder.Lateral(maxEntry), builder.On(builder.V(true))).
Join(builder.Lateral(maxID), builder.On(builder.V(true)))
query, args, _ := ds.ToSQL()
fmt.Println(query, args)
query, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(query, args)
}
Output: SELECT "e"."id", "max_entry"."max_int", "max_id"."id" FROM "entry" AS "e" INNER JOIN LATERAL (SELECT MAX("int") AS "max_int" FROM "entry" WHERE ("time" < "e"."time")) AS "max_entry" ON TRUE INNER JOIN LATERAL (SELECT "id" FROM "entry" WHERE ("int" = "max_entry"."max_int")) AS "max_id" ON TRUE [] SELECT "e"."id", "max_entry"."max_int", "max_id"."id" FROM "entry" AS "e" INNER JOIN LATERAL (SELECT MAX("int") AS "max_int" FROM "entry" WHERE ("time" < "e"."time")) AS "max_entry" ON ? INNER JOIN LATERAL (SELECT "id" FROM "entry" WHERE ("int" = "max_entry"."max_int")) AS "max_id" ON ? [true true]
func MAX ¶
func MAX(col any) exp.SQLFunctionExpression
Creates a new MAX sql function
MAX("a") -> MAX("a")
MAX(I("a")) -> MAX("a")
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(builder.MAX("col"))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT MAX("col") FROM "test" [] SELECT MAX("col") FROM "test" []
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.MAX("a").As("a")).ToSQL()
fmt.Println(sql)
}
Output: SELECT MAX("a") AS "a" FROM "test"
Example (HavingClause) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.
From("test").
Select(builder.MAX("a").As("MAX")).
GroupBy("a").
Having(builder.MAX("a").Gt(10))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT MAX("a") AS "MAX" FROM "test" GROUP BY "a" HAVING (MAX("a") > 10) [] SELECT MAX("a") AS "MAX" FROM "test" GROUP BY "a" HAVING (MAX("a") > ?) [10]
func MIN ¶
func MIN(col any) exp.SQLFunctionExpression
Creates a new MIN sql function
MIN("a") -> MIN("a")
MIN(I("a")) -> MIN("a")
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(builder.MIN("col"))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT MIN("col") FROM "test" [] SELECT MIN("col") FROM "test" []
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.MIN("a").As("a")).ToSQL()
fmt.Println(sql)
}
Output: SELECT MIN("a") AS "a" FROM "test"
Example (HavingClause) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.
From("test").
Select(builder.MIN("a").As("MIN")).
GroupBy("a").
Having(builder.MIN("a").Gt(10))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT MIN("a") AS "MIN" FROM "test" GROUP BY "a" HAVING (MIN("a") > 10) [] SELECT MIN("a") AS "MIN" FROM "test" GROUP BY "a" HAVING (MIN("a") > ?) [10]
func NTILE ¶
func NTILE(n int) exp.SQLFunctionExpression
func On ¶
func On(expressions ...exp.Expression) exp.JoinCondition
Creates a new ON clause to be used within a join
ds.Join(builder.T("my_table"), builder.On(
builder.I("my_table.fkey").Eq(builder.I("other_table.id")),
))
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Join(
builder.T("my_table"),
builder.On(builder.I("my_table.fkey").Eq(builder.I("other_table.id"))),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" INNER JOIN "my_table" ON ("my_table"."fkey" = "other_table"."id") [] SELECT * FROM "test" INNER JOIN "my_table" ON ("my_table"."fkey" = "other_table"."id") []
Example (WithEx) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Join(
builder.T("my_table"),
builder.On(builder.Ex{"my_table.fkey": builder.I("other_table.id")}),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" INNER JOIN "my_table" ON ("my_table"."fkey" = "other_table"."id") [] SELECT * FROM "test" INNER JOIN "my_table" ON ("my_table"."fkey" = "other_table"."id") []
func Or ¶
func Or(expressions ...exp.Expression) exp.ExpressionList
A list of expressions that should be ORed together
Or(I("a").Eq(10), I("b").Eq(11)) //(("a" = 10) OR ("b" = 11))
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.Or(
builder.C("col").Eq(10),
builder.C("col").Eq(20),
),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (("col" = 10) OR ("col" = 20)) [] SELECT * FROM "test" WHERE (("col" = ?) OR ("col" = ?)) [10 20]
Example (WithAnd) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("items").Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Eq(100),
builder.C("c").Neq("test"),
),
),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "items" WHERE (("a" > 10) OR (("b" = 100) AND ("c" != 'test'))) [] SELECT * FROM "items" WHERE (("a" > ?) OR (("b" = ?) AND ("c" != ?))) [10 100 test]
Example (WithExMap) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.Or(
// Ex will be anded together
builder.Ex{
"col1": 1,
"col2": true,
},
builder.Ex{
"col3": nil,
"col4": "foo",
},
),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ((("col1" = 1) AND ("col2" IS TRUE)) OR (("col3" IS NULL) AND ("col4" = 'foo'))) [] SELECT * FROM "test" WHERE ((("col1" = ?) AND ("col2" IS TRUE)) OR (("col3" IS NULL) AND ("col4" = ?))) [1 foo]
func PERCENT_RANK ¶
func PERCENT_RANK() exp.SQLFunctionExpression
func RANK ¶
func RANK() exp.SQLFunctionExpression
func ROW_NUMBER ¶
func ROW_NUMBER() exp.SQLFunctionExpression
func Range ¶
Creates a new Range to be used with a Between expression
exp.C("col").Between(exp.Range(1, 10))
Example (Identifiers) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.C("col1").Between(builder.Range(builder.C("col2"), builder.C("col3"))),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(
builder.C("col1").NotBetween(builder.Range(builder.C("col2"), builder.C("col3"))),
)
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("col1" BETWEEN "col2" AND "col3") [] SELECT * FROM "test" WHERE ("col1" BETWEEN "col2" AND "col3") [] SELECT * FROM "test" WHERE ("col1" NOT BETWEEN "col2" AND "col3") [] SELECT * FROM "test" WHERE ("col1" NOT BETWEEN "col2" AND "col3") []
Example (Numbers) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.C("col").Between(builder.Range(1, 10)),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(
builder.C("col").NotBetween(builder.Range(1, 10)),
)
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("col" BETWEEN 1 AND 10) [] SELECT * FROM "test" WHERE ("col" BETWEEN ? AND ?) [1 10] SELECT * FROM "test" WHERE ("col" NOT BETWEEN 1 AND 10) [] SELECT * FROM "test" WHERE ("col" NOT BETWEEN ? AND ?) [1 10]
Example (Strings) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.C("col").Between(builder.Range("a", "z")),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(
builder.C("col").NotBetween(builder.Range("a", "z")),
)
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("col" BETWEEN 'a' AND 'z') [] SELECT * FROM "test" WHERE ("col" BETWEEN ? AND ?) [a z] SELECT * FROM "test" WHERE ("col" NOT BETWEEN 'a' AND 'z') [] SELECT * FROM "test" WHERE ("col" NOT BETWEEN ? AND ?) [a z]
func RegisterDialect ¶
func RegisterDialect(name string, do *SQLDialectOptions)
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
opts := builder.DefaultDialectOptions()
opts.QuoteRune = '`'
builder.RegisterDialect("custom-dialect", opts)
dialect := builder.Dialect("custom-dialect")
ds := dialect.From("test")
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM `test` []
func S ¶
func S(schema string) exp.IdentifierExpression
Creates a new Schema Identifier, the generated sql will use adapter specific quoting or '"' by default, this ensures case sensitivity and in certain databases allows for special characters, (e.g. "curr-schema", "my schema").
S("schema") -> "schema" //A Schema
S("schema").Table("table") -> "schema"."table" //A Schema and table
S("schema").Table("table").Col("col") //Schema table and column
S("schema").Table("table").Col("*") //Schema table and all columns
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
s := builder.S("test_schema")
t := s.Table("test")
sql, args, _ := builder.
From(t).
Select(
t.Col("col1"),
t.Col("col2"),
t.Col("col3"),
).
ToSQL()
fmt.Println(sql, args)
}
Output: SELECT "test_schema"."test"."col1", "test_schema"."test"."col2", "test_schema"."test"."col3" FROM "test_schema"."test" []
func SUM ¶
func SUM(col any) exp.SQLFunctionExpression
Creates a new SUM sql function
SUM("a") -> SUM("a")
SUM(I("a")) -> SUM("a")
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(builder.SUM("col"))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT SUM("col") FROM "test" [] SELECT SUM("col") FROM "test" []
Example (As) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.SUM("a").As("a")).ToSQL()
fmt.Println(sql)
}
Output: SELECT SUM("a") AS "a" FROM "test"
Example (HavingClause) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.
From("test").
Select(builder.SUM("a").As("SUM")).
GroupBy("a").
Having(builder.SUM("a").Gt(10))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT SUM("a") AS "SUM" FROM "test" GROUP BY "a" HAVING (SUM("a") > 10) [] SELECT SUM("a") AS "SUM" FROM "test" GROUP BY "a" HAVING (SUM("a") > ?) [10]
func SetColumnRenameFunction ¶
Set the column rename function. This is used for struct fields that do not have a db tag to specify the column name By default all struct fields that do not have a db tag will be converted lowercase
func SetDefaultPrepared ¶
func SetDefaultPrepared(prepared bool)
SetDefaultPrepared controls the default Prepared state of all datasets. If set to true, any new dataset will use prepared queries by default.
func SetIgnoreUntaggedFields ¶
func SetIgnoreUntaggedFields(ignore bool)
Set the behavior when encountering struct fields that do not have a db tag. By default this is false; if set to true any field without a db tag will not be targeted by Select or Scan operations.
func SetTimeLocation ¶
Set the location to use when interpolating time.Time instances. See https://golang.org/pkg/time/#LoadLocation NOTE: This has no effect when using prepared statements.
Example ¶
package main
import (
"fmt"
"time"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
panic(err)
}
created, err := time.Parse(time.RFC3339, "2019-10-01T15:01:00Z")
if err != nil {
panic(err)
}
// use original time with tz info
builder.SetTimeLocation(loc)
ds := builder.Insert("test").Rows(builder.Record{
"address": "111 Address",
"name": "Bob Yukon",
"created": created,
})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
// convert time to UTC
builder.SetTimeLocation(time.UTC)
sql, _, _ = ds.ToSQL()
fmt.Println(sql)
}
Output: INSERT INTO "test" ("address", "created", "name") VALUES ('111 Address', '2019-10-01T23:01:00+08:00', 'Bob Yukon') INSERT INTO "test" ("address", "created", "name") VALUES ('111 Address', '2019-10-01T15:01:00Z', 'Bob Yukon')
func Star ¶
func Star() exp.LiteralExpression
Creates a literal *
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select(builder.Star())
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" [] SELECT * FROM "test" []
func T ¶
func T(table string) exp.IdentifierExpression
Creates a new Table Identifier, the generated sql will use adapter specific quoting or '"' by default, this ensures case sensitivity and in certain databases allows for special characters, (e.g. "curr-table", "my table").
T("table") -> "table" //A Column
T("table").Col("col") -> "table"."column" //A Column and table
T("table").Schema("schema").Col("col) -> "schema"."table"."column" //Schema table and column
T("table").Schema("schema").Col("*") -> "schema"."table".* //Also handles the * operator
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
t := builder.T("test")
sql, args, _ := builder.
From(t).
Select(
t.Col("col1"),
t.Col("col2"),
t.Col("col3"),
).
ToSQL()
fmt.Println(sql, args)
}
Output: SELECT "test"."col1", "test"."col2", "test"."col3" FROM "test" []
func Using ¶
func Using(columns ...any) exp.JoinCondition
Creates a new USING clause to be used within a join
ds.Join(builder.T("my_table"), builder.Using("fkey"))
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Join(
builder.T("my_table"),
builder.Using("fkey"),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" INNER JOIN "my_table" USING ("fkey") [] SELECT * FROM "test" INNER JOIN "my_table" USING ("fkey") []
Example (WithIdentifier) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Join(
builder.T("my_table"),
builder.Using(builder.C("fkey")),
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" INNER JOIN "my_table" USING ("fkey") [] SELECT * FROM "test" INNER JOIN "my_table" USING ("fkey") []
func V ¶
func V(val any) exp.LiteralExpression
Create a new SQL value ( alias for builder.L("?", val) ). The prrimary use case for this would be in selects. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("user").Select(
builder.V(true).As("is_verified"),
builder.V(1.2).As("version"),
"first_name",
"last_name",
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
ds = builder.From("user").Where(builder.V(1).Neq(1))
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
}
Output: SELECT TRUE AS "is_verified", 1.2 AS "version", "first_name", "last_name" FROM "user" [] SELECT * FROM "user" WHERE (1 != 1) []
Example (Prepared) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("user").Select(
builder.V(true).As("is_verified"),
builder.V(1.2).As("version"),
"first_name",
"last_name",
)
sql, args, _ := ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("user").Where(builder.V(1).Neq(1))
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT ? AS "is_verified", ? AS "version", "first_name", "last_name" FROM "user" [true 1.2] SELECT * FROM "user" WHERE (? != ?) [1 1]
func W ¶
func W(ws ...string) exp.WindowExpression
Create a new WINDOW clause
W() -> ()
W().PartitionBy("a") -> (PARTITION BY "a")
W().PartitionBy("a").OrderBy("b") -> (PARTITION BY "a" ORDER BY "b")
W().PartitionBy("a").OrderBy("b").Inherit("w1") -> ("w1" PARTITION BY "a" ORDER BY "b")
W().PartitionBy("a").OrderBy(I("b").Desc()).Inherit("w1") -> ("w1" PARTITION BY "a" ORDER BY "b" DESC)
W("w") -> "w" AS ()
W("w", "w1") -> "w" AS ("w1")
W("w").Inherit("w1") -> "w" AS ("w1")
W("w").PartitionBy("a") -> "w" AS (PARTITION BY "a")
W("w", "w1").PartitionBy("a") -> "w" AS ("w1" PARTITION BY "a")
W("w", "w1").PartitionBy("a").OrderBy("b") -> "w" AS ("w1" PARTITION BY "a" ORDER BY "b")
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Select(builder.ROW_NUMBER().Over(builder.W().PartitionBy("a").OrderBy(builder.I("b").Asc())))
query, args, _ := ds.ToSQL()
fmt.Println(query, args)
ds = builder.From("test").
Select(builder.ROW_NUMBER().OverName(builder.I("w"))).
Window(builder.W("w").PartitionBy("a").OrderBy(builder.I("b").Asc()))
query, args, _ = ds.ToSQL()
fmt.Println(query, args)
ds = builder.From("test").
Select(builder.ROW_NUMBER().OverName(builder.I("w1"))).
Window(
builder.W("w1").PartitionBy("a"),
builder.W("w").Inherit("w1").OrderBy(builder.I("b").Asc()),
)
query, args, _ = ds.ToSQL()
fmt.Println(query, args)
ds = builder.From("test").
Select(builder.ROW_NUMBER().Over(builder.W().Inherit("w").OrderBy("b"))).
Window(builder.W("w").PartitionBy("a"))
query, args, _ = ds.ToSQL()
fmt.Println(query, args)
}
Output: SELECT ROW_NUMBER() OVER (PARTITION BY "a" ORDER BY "b" ASC) FROM "test" [] SELECT ROW_NUMBER() OVER "w" FROM "test" WINDOW "w" AS (PARTITION BY "a" ORDER BY "b" ASC) [] SELECT ROW_NUMBER() OVER "w1" FROM "test" WINDOW "w1" AS (PARTITION BY "a"), "w" AS ("w1" ORDER BY "b" ASC) [] SELECT ROW_NUMBER() OVER ("w" ORDER BY "b") FROM "test" WINDOW "w" AS (PARTITION BY "a") []
Types ¶
type Database ¶
type Database struct {
// contains filtered or unexported fields
}
This struct is the wrapper for a Db. The struct delegates most calls to either an Exec instance or to the Db passed into the constructor.
func (*Database) Delete ¶
func (d *Database) Delete(table any) *DeleteDataset
func (*Database) Dialect ¶
returns this databases dialect
Example ¶
db := getDB() fmt.Println(db.Dialect())
Output: mysql
func (*Database) Exec ¶
Example ¶
db := getDB()
_, err := db.Exec(`DROP TABLE user_role`)
if err != nil {
fmt.Println("Error occurred while dropping tables", err.Error())
}
_, err = db.Exec(`DROP TABLE builder_user`)
if err != nil {
fmt.Println("Error occurred while dropping tables", err.Error())
}
fmt.Println("Dropped tables user_role and builder_user")
Output: Dropped tables user_role and builder_user
func (*Database) From ¶
func (d *Database) From(from ...any) *SelectDataset
Creates a new Dataset that uses the correct adapter and supports queries.
var ids []uint32
if err := db.From("items").Where(builder.I("id").Gt(10)).Pluck("id", &ids); err != nil {
panic(err.Error())
}
fmt.Printf("%+v", ids)
from...: Sources for you dataset, could be table names (strings), a builder.Literal or another builder.Dataset
Example ¶
db := getDB()
var names []string
if err := db.From("builder_user").Select("first_name").QueryRows(&names); err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("Fetched Users names:", names)
}
Output: Fetched Users names: [Bob Sally Vinita John]
func (*Database) Insert ¶
func (d *Database) Insert(table any) *InsertDataset
func (*Database) PrepareCtx ¶
func (*Database) QueryRowCtx ¶
func (*Database) QueryRowPartial ¶
func (*Database) QueryRowPartialCtx ¶
func (*Database) QueryRowsCtx ¶
func (*Database) QueryRowsPartial ¶
func (*Database) QueryRowsPartialCtx ¶
func (*Database) Select ¶
func (d *Database) Select(cols ...any) *SelectDataset
func (*Database) Transact ¶
func (d *Database) Transact(fn func(td *TxDatabase) error) (err error)
Transact starts a new transaction and executes it in function method
func (*Database) TransactCtx ¶
func (*Database) Truncate ¶
func (d *Database) Truncate(table ...any) *TruncateDataset
func (*Database) Update ¶
func (d *Database) Update(table any) *UpdateDataset
type DeleteDataset ¶
type DeleteDataset struct {
// contains filtered or unexported fields
}
func Delete ¶
func Delete(table any) *DeleteDataset
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Delete("items")
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
}
Output: DELETE FROM "items" []
func (*DeleteDataset) AppendSQL ¶
func (dd *DeleteDataset) AppendSQL(b sb.SQLBuilder)
Appends this Dataset's DELETE statement to the SQLBuilder This is used internally when using deletes in CTEs
func (*DeleteDataset) ClearLimit ¶
func (dd *DeleteDataset) ClearLimit() *DeleteDataset
Removes the LIMIT clause.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
// Using mysql dialect because it supports limit on delete
ds := builder.Dialect("mysql").Delete("test").Limit(10)
sql, _, _ := ds.ClearLimit().ToSQL()
fmt.Println(sql)
}
Output: DELETE `test` FROM `test`
func (*DeleteDataset) ClearOrder ¶
func (dd *DeleteDataset) ClearOrder() *DeleteDataset
Removes the ORDER BY clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Delete("test").Order(builder.C("a").Asc())
sql, _, _ := ds.ClearOrder().ToSQL()
fmt.Println(sql)
}
Output: DELETE FROM "test"
func (*DeleteDataset) ClearWhere ¶
func (dd *DeleteDataset) ClearWhere() *DeleteDataset
Removes the WHERE clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Delete("test").Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Lt(10),
builder.C("c").IsNull(),
),
),
)
sql, _, _ := ds.ClearWhere().ToSQL()
fmt.Println(sql)
}
Output: DELETE FROM "test"
func (*DeleteDataset) Dialect ¶
func (dd *DeleteDataset) Dialect() SQLDialect
Returns the current SQLDialect on the dataset
func (*DeleteDataset) Error ¶
func (dd *DeleteDataset) Error() error
Get any error that has been set or nil if no error has been set.
func (*DeleteDataset) Exec ¶
func (dd *DeleteDataset) Exec() (sql.Result, error)
Creates an QueryExecutor to execute the query.
db.Delete("test").Exec()
See Dataset#ToUpdateSQL for arguments
func (*DeleteDataset) Expression ¶
func (dd *DeleteDataset) Expression() exp.Expression
func (*DeleteDataset) From ¶
func (dd *DeleteDataset) From(table any) *DeleteDataset
Adds a FROM clause. This return a new dataset with the original sources replaced. See examples. You can pass in the following.
string: Will automatically be turned into an ddentifier Dataset: Will be added as a sub select. If the Dataset is not aliased it will automatically be aliased LiteralExpression: (See Literal) Will use the literal SQL
func (*DeleteDataset) GetAs ¶
func (dd *DeleteDataset) GetAs() exp.IdentifierExpression
func (*DeleteDataset) GetClauses ¶
func (dd *DeleteDataset) GetClauses() exp.DeleteClauses
Returns the current clauses on the dataset.
func (*DeleteDataset) IsPrepared ¶
func (dd *DeleteDataset) IsPrepared() bool
Returns true if Prepared(true) has been called on this dataset
func (*DeleteDataset) Limit ¶
func (dd *DeleteDataset) Limit(limit uint) *DeleteDataset
Adds a LIMIT clause. If the LIMIT is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Dialect("mysql").Delete("test").Limit(10)
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: DELETE FROM `test` LIMIT 10
func (*DeleteDataset) LimitAll ¶
func (dd *DeleteDataset) LimitAll() *DeleteDataset
Adds a LIMIT ALL clause. If the LIMIT is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
// Using mysql dialect because it supports limit on delete
ds := builder.Dialect("mysql").Delete("test").LimitAll()
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: DELETE FROM `test` LIMIT ALL
func (*DeleteDataset) Order ¶
func (dd *DeleteDataset) Order(order ...exp.OrderedExpression) *DeleteDataset
Adds a ORDER clause. If the ORDER is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
// use mysql dialect because it supports order by on deletes
ds := builder.Dialect("mysql").Delete("test").Order(builder.C("a").Asc())
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: DELETE FROM `test` ORDER BY `a` ASC
func (*DeleteDataset) OrderAppend ¶
func (dd *DeleteDataset) OrderAppend(order ...exp.OrderedExpression) *DeleteDataset
Adds a more columns to the current ORDER BY clause. If no order has be previously specified it is the same as calling Order. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
// use mysql dialect because it supports order by on deletes
ds := builder.Dialect("mysql").Delete("test").Order(builder.C("a").Asc())
sql, _, _ := ds.OrderAppend(builder.C("b").Desc().NullsLast()).ToSQL()
fmt.Println(sql)
}
Output: DELETE FROM `test` ORDER BY `a` ASC, `b` DESC NULLS LAST
func (*DeleteDataset) OrderPrepend ¶
func (dd *DeleteDataset) OrderPrepend(order ...exp.OrderedExpression) *DeleteDataset
Adds a more columns to the beginning of the current ORDER BY clause. If no order has be previously specified it is the same as calling Order. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
// use mysql dialect because it supports order by on deletes
ds := builder.Dialect("mysql").Delete("test").Order(builder.C("a").Asc())
sql, _, _ := ds.OrderPrepend(builder.C("b").Desc().NullsLast()).ToSQL()
fmt.Println(sql)
}
Output: DELETE FROM `test` ORDER BY `b` DESC NULLS LAST, `a` ASC
func (*DeleteDataset) Prepared ¶
func (dd *DeleteDataset) Prepared(prepared bool) *DeleteDataset
Set the parameter interpolation behavior. See examples
prepared: If true the dataset WILL NOT interpolate the parameters.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, args, _ := builder.Delete("items").Prepared(true).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.Delete("items").
Prepared(true).
Where(builder.Ex{"id": builder.Op{"gt": 10}}).
ToSQL()
fmt.Println(sql, args)
}
Output: DELETE FROM "items" [] DELETE FROM "items" WHERE ("id" > ?) [10]
func (*DeleteDataset) QueryRow ¶
func (dd *DeleteDataset) QueryRow(v any) error
func (*DeleteDataset) QueryRowCtx ¶
func (dd *DeleteDataset) QueryRowCtx(ctx context.Context, v any) error
func (*DeleteDataset) QueryRowPartial ¶
func (dd *DeleteDataset) QueryRowPartial(v any) error
func (*DeleteDataset) QueryRowPartialCtx ¶
func (dd *DeleteDataset) QueryRowPartialCtx(ctx context.Context, v any) error
func (*DeleteDataset) QueryRows ¶
func (dd *DeleteDataset) QueryRows(v any) error
func (*DeleteDataset) QueryRowsCtx ¶
func (dd *DeleteDataset) QueryRowsCtx(ctx context.Context, v any) error
func (*DeleteDataset) QueryRowsPartial ¶
func (dd *DeleteDataset) QueryRowsPartial(v any) error
func (*DeleteDataset) QueryRowsPartialCtx ¶
func (dd *DeleteDataset) QueryRowsPartialCtx(ctx context.Context, v any) error
func (*DeleteDataset) Returning ¶
func (dd *DeleteDataset) Returning(returning ...any) *DeleteDataset
Adds a RETURNING clause to the dataset if the adapter supports it.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Delete("items")
sql, args, _ := ds.Returning("id").ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Returning("id").Where(builder.C("id").IsNotNull()).ToSQL()
fmt.Println(sql, args)
}
Output: DELETE FROM "items" RETURNING "id" [] DELETE FROM "items" WHERE ("id" IS NOT NULL) RETURNING "id" []
func (*DeleteDataset) ReturnsColumns ¶
func (dd *DeleteDataset) ReturnsColumns() bool
func (*DeleteDataset) SetDialect ¶
func (dd *DeleteDataset) SetDialect(dialect SQLDialect) *DeleteDataset
Set the dialect for this dataset.
func (*DeleteDataset) SetError ¶
func (dd *DeleteDataset) SetError(err error) *DeleteDataset
Set an error on the dataset if one has not already been set. This error will be returned by a future call to Error or as part of ToSQL. This can be used by end users to record errors while building up queries without having to track those separately.
func (*DeleteDataset) ToSQL ¶
func (dd *DeleteDataset) ToSQL() (sql string, params []any, err error)
Generates a DELETE sql statement, if Prepared has been called with true then the parameters will not be interpolated. See examples.
Errors:
- There is an error generating the SQL
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, args, _ := builder.Delete("items").ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.Delete("items").
Where(builder.Ex{"id": builder.Op{"gt": 10}}).
ToSQL()
fmt.Println(sql, args)
}
Output: DELETE FROM "items" [] DELETE FROM "items" WHERE ("id" > 10) []
func (*DeleteDataset) Where ¶
func (dd *DeleteDataset) Where(expressions ...exp.Expression) *DeleteDataset
Adds a WHERE clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
// By default everything is anded together
sql, _, _ := builder.Delete("test").Where(builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql)
// You can use ExOr to get ORed expressions together
sql, _, _ = builder.Delete("test").Where(builder.ExOr{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql)
// You can use Or with Ex to Or multiple Ex maps together
sql, _, _ = builder.Delete("test").Where(
builder.Or(
builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
},
builder.Ex{
"c": nil,
"d": []string{"a", "b", "c"},
},
),
).ToSQL()
fmt.Println(sql)
// By default everything is anded together
sql, _, _ = builder.Delete("test").Where(
builder.C("a").Gt(10),
builder.C("b").Lt(10),
builder.C("c").IsNull(),
builder.C("d").In("a", "b", "c"),
).ToSQL()
fmt.Println(sql)
// You can use a combination of Ors and Ands
sql, _, _ = builder.Delete("test").Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Lt(10),
builder.C("c").IsNull(),
),
),
).ToSQL()
fmt.Println(sql)
}
Output: DELETE FROM "test" WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c'))) DELETE FROM "test" WHERE (("a" > 10) OR ("b" < 10) OR ("c" IS NULL) OR ("d" IN ('a', 'b', 'c'))) DELETE FROM "test" WHERE ((("a" > 10) AND ("b" < 10)) OR (("c" IS NULL) AND ("d" IN ('a', 'b', 'c')))) DELETE FROM "test" WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c'))) DELETE FROM "test" WHERE (("a" > 10) OR (("b" < 10) AND ("c" IS NULL)))
Example (Prepared) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
// By default everything is anded together
sql, args, _ := builder.Delete("test").Prepared(true).Where(builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql, args)
// You can use ExOr to get ORed expressions together
sql, args, _ = builder.Delete("test").Prepared(true).Where(builder.ExOr{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql, args)
// You can use Or with Ex to Or multiple Ex maps together
sql, args, _ = builder.Delete("test").Prepared(true).Where(
builder.Or(
builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
},
builder.Ex{
"c": nil,
"d": []string{"a", "b", "c"},
},
),
).ToSQL()
fmt.Println(sql, args)
// By default everything is anded together
sql, args, _ = builder.Delete("test").Prepared(true).Where(
builder.C("a").Gt(10),
builder.C("b").Lt(10),
builder.C("c").IsNull(),
builder.C("d").In("a", "b", "c"),
).ToSQL()
fmt.Println(sql, args)
// You can use a combination of Ors and Ands
sql, args, _ = builder.Delete("test").Prepared(true).Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Lt(10),
builder.C("c").IsNull(),
),
),
).ToSQL()
fmt.Println(sql, args)
}
Output: DELETE FROM "test" WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [10 10 a b c] DELETE FROM "test" WHERE (("a" > ?) OR ("b" < ?) OR ("c" IS NULL) OR ("d" IN (?, ?, ?))) [10 10 a b c] DELETE FROM "test" WHERE ((("a" > ?) AND ("b" < ?)) OR (("c" IS NULL) AND ("d" IN (?, ?, ?)))) [10 10 a b c] DELETE FROM "test" WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [10 10 a b c] DELETE FROM "test" WHERE (("a" > ?) OR (("b" < ?) AND ("c" IS NULL))) [10 10]
func (*DeleteDataset) With ¶
func (dd *DeleteDataset) With(name string, subquery exp.Expression) *DeleteDataset
Creates a WITH clause for a common table expression (CTE).
The name will be available to SELECT from in the associated query; and can optionally contain a list of column names "name(col1, col2, col3)".
The name will refer to the results of the specified subquery.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, _, _ := builder.Delete("test").
With("check_vals(val)", builder.From().Select(builder.L("123"))).
Where(builder.C("val").Eq(builder.From("check_vals").Select("val"))).
ToSQL()
fmt.Println(sql)
}
Output: WITH check_vals(val) AS (SELECT 123) DELETE FROM "test" WHERE ("val" IN (SELECT "val" FROM "check_vals"))
func (*DeleteDataset) WithDialect ¶
func (dd *DeleteDataset) WithDialect(dl string) *DeleteDataset
Sets the adapter used to serialize values and create the SQL statement
func (*DeleteDataset) WithRecursive ¶
func (dd *DeleteDataset) WithRecursive(name string, subquery exp.Expression) *DeleteDataset
Creates a WITH RECURSIVE clause for a common table expression (CTE)
The name will be available to SELECT from in the associated query; and must contain a list of column names "name(col1, col2, col3)" for a recursive clause.
The name will refer to the results of the specified subquery. The subquery for a recursive query will always end with a UNION or UNION ALL with a clause that refers to the CTE by name.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, _, _ := builder.Delete("nums").
WithRecursive("nums(x)",
builder.From().Select(builder.L("1")).
UnionAll(builder.From("nums").
Select(builder.L("x+1")).Where(builder.C("x").Lt(5)))).
ToSQL()
fmt.Println(sql)
}
Output: WITH RECURSIVE nums(x) AS (SELECT 1 UNION ALL (SELECT x+1 FROM "nums" WHERE ("x" < 5))) DELETE FROM "nums"
type DialectWrapper ¶
type DialectWrapper struct {
// contains filtered or unexported fields
}
func Dialect ¶
func Dialect(dialect string) DialectWrapper
Creates a new DialectWrapper to create builder.Datasets or builder.Databases with the specified dialect.
Example (DatasetMysql) ¶
Creating a mysql dataset. Be sure to import the mysql adapter.
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
// import _ "github.com/Tooooommy/builder/v9/dialect/mysql"
d := builder.Dialect("mysql")
ds := d.From("test").Where(builder.Ex{
"foo": "bar",
"baz": []int64{1, 2, 3},
}).Limit(10)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM `test` WHERE ((`baz` IN (1, 2, 3)) AND (`foo` = 'bar')) LIMIT 10 [] SELECT * FROM `test` WHERE ((`baz` IN (?, ?, ?)) AND (`foo` = ?)) LIMIT ? [1 2 3 bar 10]
Example (DatasetPostgres) ¶
Creating a mysql dataset. Be sure to import the postgres adapter
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
// import _ "github.com/Tooooommy/builder/v9/dialect/postgres"
d := builder.Dialect("postgres")
ds := d.From("test").Where(builder.Ex{
"foo": "bar",
"baz": []int64{1, 2, 3},
}).Limit(10)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (("baz" IN (1, 2, 3)) AND ("foo" = 'bar')) LIMIT 10 [] SELECT * FROM "test" WHERE (("baz" IN ($1, $2, $3)) AND ("foo" = $4)) LIMIT $5 [1 2 3 bar 10]
Example (DatasetSqlite3) ¶
Creating a mysql dataset. Be sure to import the sqlite3 adapter
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
// import _ "github.com/Tooooommy/builder/v9/dialect/sqlite3"
d := builder.Dialect("sqlite3")
ds := d.From("test").Where(builder.Ex{
"foo": "bar",
"baz": []int64{1, 2, 3},
}).Limit(10)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (("baz" IN (1, 2, 3)) AND ("foo" = 'bar')) LIMIT 10 [] SELECT * FROM "test" WHERE (("baz" IN (?, ?, ?)) AND ("foo" = ?)) LIMIT ? [1 2 3 bar 10]
Example (DbMysql) ¶
Creating a mysql database. Be sure to import the mysql adapter.
package main
import (
"fmt"
"github.com/DATA-DOG/go-sqlmock"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
// import _ "github.com/Tooooommy/builder/v9/dialect/mysql"
type item struct {
ID int64 `db:"id"`
Address string `db:"address"`
Name string `db:"name"`
}
// set up a mock db this would normally be
// db, err := sql.Open("mysql", dbURI)
// if err != nil {
// panic(err.Error())
// }
mDB, mock, _ := sqlmock.New()
d := builder.Dialect("mysql")
conn := sqlx.NewSqlConnFromDB(mDB)
db := d.DB(conn)
// use the db.From to get a dataset to execute queries
ds := db.From("items").Where(builder.C("id").Eq(1))
// set up mock for example purposes
mock.ExpectQuery("SELECT \\* FROM `items` WHERE \\(`id` = 1\\) LIMIT 1").
WillReturnRows(
sqlmock.NewRows([]string{"id", "address", "name"}).
FromCSVString("1, 111 Test Addr,Test1"),
)
var it item
err := ds.QueryRow(&it)
fmt.Println(it, err)
// set up mock for example purposes
mock.ExpectQuery("SELECT \\* FROM `items` WHERE \\(`id` = \\?\\) LIMIT \\?").
WithArgs(1, 1).
WillReturnRows(
sqlmock.NewRows([]string{"id", "address", "name"}).
FromCSVString("1, 111 Test Addr,Test1"),
)
err = ds.Prepared(true).QueryRow(&it)
fmt.Println(it, err)
}
Output: {1 111 Test Addr Test1} <nil> {1 111 Test Addr Test1} <nil>
Example (DbPostgres) ¶
Creating a postgres dataset. Be sure to import the postgres adapter
package main
import (
"fmt"
"github.com/DATA-DOG/go-sqlmock"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
// import _ "github.com/Tooooommy/builder/v9/dialect/postgres"
type item struct {
ID int64 `db:"id"`
Address string `db:"address"`
Name string `db:"name"`
}
// set up a mock db this would normally be
// db, err := sql.Open("postgres", dbURI)
// if err != nil {
// panic(err.Error())
// }
mDB, mock, _ := sqlmock.New()
d := builder.Dialect("postgres")
conn := sqlx.NewSqlConnFromDB(mDB)
db := d.DB(conn)
// use the db.From to get a dataset to execute queries
ds := db.From("items").Where(builder.C("id").Eq(1))
// set up mock for example purposes
mock.ExpectQuery(`SELECT \* FROM "items" WHERE \("id" = 1\) LIMIT 1`).
WillReturnRows(
sqlmock.NewRows([]string{"id", "address", "name"}).
FromCSVString("1, 111 Test Addr,Test1"),
)
var it item
err := ds.QueryRow(&it)
fmt.Println(it, err)
// set up mock for example purposes
mock.ExpectQuery(`SELECT \* FROM "items" WHERE \("id" = \$1\) LIMIT \$2`).
WithArgs(1, 1).
WillReturnRows(
sqlmock.NewRows([]string{"id", "address", "name"}).
FromCSVString("1, 111 Test Addr,Test1"),
)
err = ds.Prepared(true).QueryRow(&it)
fmt.Println(it, err)
}
Output: {1 111 Test Addr Test1} <nil> {1 111 Test Addr Test1} <nil>
Example (DbSqlite3) ¶
Creating a sqlite3 database. Be sure to import the sqlite3 adapter
package main
import (
"fmt"
"github.com/DATA-DOG/go-sqlmock"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
// import _ "github.com/Tooooommy/builder/v9/dialect/sqlite3"
type item struct {
ID int64 `db:"id"`
Address string `db:"address"`
Name string `db:"name"`
}
// set up a mock db this would normally be
// db, err := sql.Open("sqlite3", dbURI)
// if err != nil {
// panic(err.Error())
// }
mDB, mock, _ := sqlmock.New()
d := builder.Dialect("sqlite3")
conn := sqlx.NewSqlConnFromDB(mDB)
db := d.DB(conn)
// use the db.From to get a dataset to execute queries
ds := db.From("items").Where(builder.C("id").Eq(1))
// set up mock for example purposes
mock.ExpectQuery(`SELECT \* FROM "items" WHERE \("id" = 1\) LIMIT 1`).
WillReturnRows(
sqlmock.NewRows([]string{"id", "address", "name"}).
FromCSVString("1, 111 Test Addr,Test1"),
)
var it item
err := ds.QueryRow(&it)
fmt.Println(it, err)
// set up mock for example purposes
mock.ExpectQuery(`SELECT \* FROM "items" WHERE \("id" = \?\) LIMIT \?`).
WithArgs(1, 1).
WillReturnRows(
sqlmock.NewRows([]string{"id", "address", "name"}).
FromCSVString("1, 111 Test Addr,Test1"),
)
err = ds.Prepared(true).QueryRow(&it)
fmt.Println(it, err)
}
Output: {1 111 Test Addr Test1} <nil> {1 111 Test Addr Test1} <nil>
func (DialectWrapper) Delete ¶
func (dw DialectWrapper) Delete(table any) *DeleteDataset
Create a new dataset for creating DELETE sql statements
func (DialectWrapper) From ¶
func (dw DialectWrapper) From(table ...any) *SelectDataset
Create a new dataset for creating SELECT sql statements
func (DialectWrapper) Insert ¶
func (dw DialectWrapper) Insert(table any) *InsertDataset
Create a new dataset for creating INSERT sql statements
func (DialectWrapper) Select ¶
func (dw DialectWrapper) Select(cols ...any) *SelectDataset
Create a new dataset for creating SELECT sql statements
func (DialectWrapper) Truncate ¶
func (dw DialectWrapper) Truncate(table ...any) *TruncateDataset
Create a new dataset for creating TRUNCATE sql statements
func (DialectWrapper) Update ¶
func (dw DialectWrapper) Update(table any) *UpdateDataset
Create a new dataset for creating UPDATE sql statements
type Ex ¶
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("items").Where(
builder.Ex{
"col1": "a",
"col2": 1,
"col3": true,
"col4": false,
"col5": nil,
"col6": []string{"a", "b", "c"},
},
)
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "items" WHERE (("col1" = 'a') AND ("col2" = 1) AND ("col3" IS TRUE) AND ("col4" IS FALSE) AND ("col5" IS NULL) AND ("col6" IN ('a', 'b', 'c'))) [] SELECT * FROM "items" WHERE (("col1" = ?) AND ("col2" = ?) AND ("col3" IS TRUE) AND ("col4" IS FALSE) AND ("col5" IS NULL) AND ("col6" IN (?, ?, ?))) [a 1 a b c]
Example (In) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// using an Ex expression map
sql, _, _ := builder.From("test").Where(builder.Ex{
"a": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" WHERE ("a" IN ('a', 'b', 'c'))
Example (WithOp) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("items").Where(
builder.Ex{
"col1": builder.Op{"neq": "a"},
"col3": builder.Op{"isNot": true},
"col6": builder.Op{"notIn": []string{"a", "b", "c"}},
},
).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "items" WHERE (("col1" != 'a') AND ("col3" IS NOT TRUE) AND ("col6" NOT IN ('a', 'b', 'c'))) []
type ExOr ¶
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("items").Where(
builder.ExOr{
"col1": "a",
"col2": 1,
"col3": true,
"col4": false,
"col5": nil,
"col6": []string{"a", "b", "c"},
},
).ToSQL()
fmt.Println(sql, args)
// nolint:lll // sql statements are long
Output:
Example (WithOp) ¶
package main
import (
"fmt"
"regexp"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("items").Where(builder.ExOr{
"col1": builder.Op{"neq": "a"},
"col3": builder.Op{"isNot": true},
"col6": builder.Op{"notIn": []string{"a", "b", "c"}},
}).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("items").Where(builder.ExOr{
"col1": builder.Op{"gt": 1},
"col2": builder.Op{"gte": 1},
"col3": builder.Op{"lt": 1},
"col4": builder.Op{"lte": 1},
}).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("items").Where(builder.ExOr{
"col1": builder.Op{"like": "a%"},
"col2": builder.Op{"notLike": "a%"},
"col3": builder.Op{"iLike": "a%"},
"col4": builder.Op{"notILike": "a%"},
}).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("items").Where(builder.ExOr{
"col1": builder.Op{"like": regexp.MustCompile("^[ab]")},
"col2": builder.Op{"notLike": regexp.MustCompile("^[ab]")},
"col3": builder.Op{"iLike": regexp.MustCompile("^[ab]")},
"col4": builder.Op{"notILike": regexp.MustCompile("^[ab]")},
}).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "items" WHERE (("col1" != 'a') OR ("col3" IS NOT TRUE) OR ("col6" NOT IN ('a', 'b', 'c'))) SELECT * FROM "items" WHERE (("col1" > 1) OR ("col2" >= 1) OR ("col3" < 1) OR ("col4" <= 1)) SELECT * FROM "items" WHERE (("col1" LIKE 'a%') OR ("col2" NOT LIKE 'a%') OR ("col3" ILIKE 'a%') OR ("col4" NOT ILIKE 'a%')) SELECT * FROM "items" WHERE (("col1" ~ '^[ab]') OR ("col2" !~ '^[ab]') OR ("col3" ~* '^[ab]') OR ("col4" !~* '^[ab]'))
type Expression ¶
type Expression = exp.Expression
type InsertDataset ¶
type InsertDataset struct {
// contains filtered or unexported fields
}
func Insert ¶
func Insert(table any) *InsertDataset
Creates a new InsertDataset for the provided table. Using this method will only allow you to create SQL user Database#From to create an InsertDataset with query capabilities
Example (BuilderRecord) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
ds := builder.Insert("user").Rows(
builder.Record{"first_name": "Greg", "last_name": "Farley"},
builder.Record{"first_name": "Jimmy", "last_name": "Stewart"},
builder.Record{"first_name": "Jeff", "last_name": "Jeffers"},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("first_name", "last_name") VALUES ('Greg', 'Farley'), ('Jimmy', 'Stewart'), ('Jeff', 'Jeffers') []
Example (ColsAndVals) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
ds := builder.Insert("user").
Cols("first_name", "last_name").
Vals(
builder.Vals{"Greg", "Farley"},
builder.Vals{"Jimmy", "Stewart"},
builder.Vals{"Jeff", "Jeffers"},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("first_name", "last_name") VALUES ('Greg', 'Farley'), ('Jimmy', 'Stewart'), ('Jeff', 'Jeffers') []
Example (FromQuery) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
ds := builder.Insert("user").Prepared(true).
FromQuery(builder.From("other_table"))
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" SELECT * FROM "other_table" []
Example (FromQueryWithCols) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
ds := builder.Insert("user").Prepared(true).
Cols("first_name", "last_name").
FromQuery(builder.From("other_table").Select("fn", "ln"))
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("first_name", "last_name") SELECT "fn", "ln" FROM "other_table" []
Example (Map) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
ds := builder.Insert("user").Rows(
map[string]any{"first_name": "Greg", "last_name": "Farley"},
map[string]any{"first_name": "Jimmy", "last_name": "Stewart"},
map[string]any{"first_name": "Jeff", "last_name": "Jeffers"},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("first_name", "last_name") VALUES ('Greg', 'Farley'), ('Jimmy', 'Stewart'), ('Jeff', 'Jeffers') []
Example (Prepared) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
ds := builder.Insert("user").Prepared(true).Rows(
builder.Record{"first_name": "Greg", "last_name": "Farley"},
builder.Record{"first_name": "Jimmy", "last_name": "Stewart"},
builder.Record{"first_name": "Jeff", "last_name": "Jeffers"},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("first_name", "last_name") VALUES (?, ?), (?, ?), (?, ?) [Greg Farley Jimmy Stewart Jeff Jeffers]
Example (Struct) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type User struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
ds := builder.Insert("user").Rows(
User{FirstName: "Greg", LastName: "Farley"},
User{FirstName: "Jimmy", LastName: "Stewart"},
User{FirstName: "Jeff", LastName: "Jeffers"},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("first_name", "last_name") VALUES ('Greg', 'Farley'), ('Jimmy', 'Stewart'), ('Jeff', 'Jeffers') []
func (*InsertDataset) AppendSQL ¶
func (id *InsertDataset) AppendSQL(b sb.SQLBuilder)
Appends this Dataset's INSERT statement to the SQLBuilder This is used internally when using inserts in CTEs
func (*InsertDataset) As ¶
func (id *InsertDataset) As(alias string) *InsertDataset
Sets the alias for this dataset. This is typically used when using a Dataset as MySQL upsert
func (*InsertDataset) ClearCols ¶
func (id *InsertDataset) ClearCols() *InsertDataset
Clears the Columns to insert into
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
ds := builder.Insert("test").Cols("a", "b", "c")
insertSQL, _, _ := ds.ClearCols().Cols("other_a", "other_b", "other_c").
FromQuery(builder.From("foo").Select("d", "e", "f")).
ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test" ("other_a", "other_b", "other_c") SELECT "d", "e", "f" FROM "foo"
func (*InsertDataset) ClearOnConflict ¶
func (id *InsertDataset) ClearOnConflict() *InsertDataset
Clears the on conflict clause. See example
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type item struct {
ID uint32 `db:"id" builder:"skipinsert"`
Address string `db:"address"`
Name string `db:"name"`
}
ds := builder.Insert("items").OnConflict(builder.DoNothing())
insertSQL, args, _ := ds.ClearOnConflict().Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
).ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') []
func (*InsertDataset) ClearRows ¶
func (id *InsertDataset) ClearRows() *InsertDataset
Clears the rows for this insert dataset. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type item struct {
ID uint32 `builder:"skipinsert"`
Address string
Name string
}
ds := builder.Insert("items").Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
)
insertSQL, args, _ := ds.ClearRows().ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" DEFAULT VALUES []
func (*InsertDataset) ClearVals ¶
func (id *InsertDataset) ClearVals() *InsertDataset
Clears the values. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, _, _ := builder.Insert("test").
Cols("a", "b", "c").
Vals(
[]any{"a1", "b1", "c1"},
[]any{"a2", "b1", "c1"},
[]any{"a3", "b1", "c1"},
).
ClearVals().
ToSQL()
fmt.Println(insertSQL)
insertSQL, _, _ = builder.Insert("test").
Cols("a", "b", "c").
Vals([]any{"a1", "b1", "c1"}).
Vals([]any{"a2", "b2", "c2"}).
Vals([]any{"a3", "b3", "c3"}).
ClearVals().
ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test" DEFAULT VALUES INSERT INTO "test" DEFAULT VALUES
func (*InsertDataset) Cols ¶
func (id *InsertDataset) Cols(cols ...any) *InsertDataset
Sets the Columns to insert into
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, _, _ := builder.Insert("test").
Cols("a", "b", "c").
Vals(
[]any{"a1", "b1", "c1"},
[]any{"a2", "b1", "c1"},
[]any{"a3", "b1", "c1"},
).
ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test" ("a", "b", "c") VALUES ('a1', 'b1', 'c1'), ('a2', 'b1', 'c1'), ('a3', 'b1', 'c1')
Example (WithFromQuery) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, _, _ := builder.Insert("test").
Cols("a", "b", "c").
FromQuery(builder.From("foo").Select("d", "e", "f")).
ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test" ("a", "b", "c") SELECT "d", "e", "f" FROM "foo"
func (*InsertDataset) ColsAppend ¶
func (id *InsertDataset) ColsAppend(cols ...any) *InsertDataset
Adds columns to the current list of columns clause. See examples
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, _, _ := builder.Insert("test").
Cols("a", "b").
ColsAppend("c").
Vals(
[]any{"a1", "b1", "c1"},
[]any{"a2", "b1", "c1"},
[]any{"a3", "b1", "c1"},
).
ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test" ("a", "b", "c") VALUES ('a1', 'b1', 'c1'), ('a2', 'b1', 'c1'), ('a3', 'b1', 'c1')
func (*InsertDataset) Dialect ¶
func (id *InsertDataset) Dialect() SQLDialect
Returns the current adapter on the dataset
func (*InsertDataset) Error ¶
func (id *InsertDataset) Error() error
Get any error that has been set or nil if no error has been set.
func (*InsertDataset) Expression ¶
func (id *InsertDataset) Expression() exp.Expression
func (*InsertDataset) FromQuery ¶
func (id *InsertDataset) FromQuery(from exp.AppendableExpression) *InsertDataset
Adds a subquery to the insert. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, _, _ := builder.Insert("test").
FromQuery(builder.From("test2").Where(builder.C("age").Gt(10))).
ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test" SELECT * FROM "test2" WHERE ("age" > 10)
func (*InsertDataset) GetAs ¶
func (id *InsertDataset) GetAs() exp.IdentifierExpression
func (*InsertDataset) GetClauses ¶
func (id *InsertDataset) GetClauses() exp.InsertClauses
Returns the current clauses on the dataset.
func (*InsertDataset) Into ¶
func (id *InsertDataset) Into(into any) *InsertDataset
Sets the table to insert INTO. This return a new dataset with the original table replaced. See examples. You can pass in the following.
string: Will automatically be turned into an identifier Expression: Any valid expression (IdentifierExpression, AliasedExpression, Literal, etc.)
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
ds := builder.Insert("test")
insertSQL, _, _ := ds.Into("test2").Rows(builder.Record{"first_name": "bob", "last_name": "yukon"}).ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test2" ("first_name", "last_name") VALUES ('bob', 'yukon')
Example (Aliased) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
ds := builder.Insert("test")
insertSQL, _, _ := ds.
Into(builder.T("test").As("t")).
Rows(builder.Record{"first_name": "bob", "last_name": "yukon"}).
ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test" AS "t" ("first_name", "last_name") VALUES ('bob', 'yukon')
func (*InsertDataset) IsPrepared ¶
func (id *InsertDataset) IsPrepared() bool
func (*InsertDataset) OnConflict ¶
func (id *InsertDataset) OnConflict(conflict exp.ConflictExpression) *InsertDataset
Adds an (ON CONFLICT/ON DUPLICATE KEY) clause to the dataset if the dialect supports it. See examples.
Example (DoNothing) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type item struct {
ID uint32 `db:"id" builder:"skipinsert"`
Address string `db:"address"`
Name string `db:"name"`
}
insertSQL, args, _ := builder.Insert("items").Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
).OnConflict(builder.DoNothing()).ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') ON CONFLICT DO NOTHING []
Example (DoUpdate) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, args, _ := builder.Insert("items").
Rows(
builder.Record{"name": "Test1", "address": "111 Test Addr"},
builder.Record{"name": "Test2", "address": "112 Test Addr"},
).
OnConflict(builder.DoUpdate("key", builder.Record{"updated": builder.L("NOW()")})).
ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') ON CONFLICT (key) DO UPDATE SET "updated"=NOW() []
Example (DoUpdateWithWhere) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type item struct {
ID uint32 `db:"id" builder:"skipinsert"`
Address string `db:"address"`
Name string `db:"name"`
}
insertSQL, args, _ := builder.Insert("items").
Rows([]item{
{Name: "Test1", Address: "111 Test Addr"},
{Name: "Test2", Address: "112 Test Addr"},
}).
OnConflict(builder.DoUpdate(
"key",
builder.Record{"updated": builder.L("NOW()")}).Where(builder.C("allow_update").IsTrue()),
).
ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') ON CONFLICT (key) DO UPDATE SET "updated"=NOW() WHERE ("allow_update" IS TRUE) []
func (*InsertDataset) Prepared ¶
func (id *InsertDataset) Prepared(prepared bool) *InsertDataset
Set the parameter interpolation behavior. See examples
prepared: If true the dataset WILL NOT interpolate the parameters.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type item struct {
ID uint32 `db:"id" builder:"skipinsert"`
Address string `db:"address"`
Name string `db:"name"`
}
insertSQL, args, _ := builder.Insert("items").Prepared(true).Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
).ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.Insert("items").Prepared(true).Rows(
builder.Record{"name": "Test1", "address": "111 Test Addr"},
builder.Record{"name": "Test2", "address": "112 Test Addr"},
).ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.Insert("items").Prepared(true).Rows(
[]item{
{Name: "Test1", Address: "111 Test Addr"},
{Name: "Test2", Address: "112 Test Addr"},
}).ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.Insert("items").Prepared(true).Rows(
[]builder.Record{
{"name": "Test1", "address": "111 Test Addr"},
{"name": "Test2", "address": "112 Test Addr"},
}).ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES (?, ?), (?, ?) [111 Test Addr Test1 112 Test Addr Test2] INSERT INTO "items" ("address", "name") VALUES (?, ?), (?, ?) [111 Test Addr Test1 112 Test Addr Test2] INSERT INTO "items" ("address", "name") VALUES (?, ?), (?, ?) [111 Test Addr Test1 112 Test Addr Test2] INSERT INTO "items" ("address", "name") VALUES (?, ?), (?, ?) [111 Test Addr Test1 112 Test Addr Test2]
func (*InsertDataset) QueryRow ¶
func (id *InsertDataset) QueryRow(v any) error
func (*InsertDataset) QueryRowCtx ¶
func (id *InsertDataset) QueryRowCtx(ctx context.Context, v any) error
func (*InsertDataset) QueryRowPartial ¶
func (id *InsertDataset) QueryRowPartial(v any) error
func (*InsertDataset) QueryRowPartialCtx ¶
func (id *InsertDataset) QueryRowPartialCtx(ctx context.Context, v any) error
func (*InsertDataset) QueryRows ¶
func (id *InsertDataset) QueryRows(v any) error
func (*InsertDataset) QueryRowsCtx ¶
func (id *InsertDataset) QueryRowsCtx(ctx context.Context, v any) error
func (*InsertDataset) QueryRowsPartial ¶
func (id *InsertDataset) QueryRowsPartial(v any) error
func (*InsertDataset) QueryRowsPartialCtx ¶
func (id *InsertDataset) QueryRowsPartialCtx(ctx context.Context, v any) error
func (*InsertDataset) Returning ¶
func (id *InsertDataset) Returning(returning ...any) *InsertDataset
Adds a RETURNING clause to the dataset if the adapter supports it See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, _, _ := builder.Insert("test").
Returning("id").
Rows(builder.Record{"a": "a", "b": "b"}).
ToSQL()
fmt.Println(insertSQL)
insertSQL, _, _ = builder.Insert("test").
Returning(builder.T("test").All()).
Rows(builder.Record{"a": "a", "b": "b"}).
ToSQL()
fmt.Println(insertSQL)
insertSQL, _, _ = builder.Insert("test").
Returning("a", "b").
Rows(builder.Record{"a": "a", "b": "b"}).
ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test" ("a", "b") VALUES ('a', 'b') RETURNING "id" INSERT INTO "test" ("a", "b") VALUES ('a', 'b') RETURNING "test".* INSERT INTO "test" ("a", "b") VALUES ('a', 'b') RETURNING "a", "b"
func (*InsertDataset) ReturnsColumns ¶
func (id *InsertDataset) ReturnsColumns() bool
func (*InsertDataset) Rows ¶
func (id *InsertDataset) Rows(rows ...any) *InsertDataset
Insert rows. Rows can be a map, builder.Record or struct. See examples.
Example (WithEmbeddedStruct) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type Address struct {
Street string `db:"address_street"`
State string `db:"address_state"`
}
type User struct {
Address
FirstName string
LastName string
}
ds := builder.Insert("user").Rows(
User{Address: Address{Street: "111 Street", State: "NY"}, FirstName: "Greg", LastName: "Farley"},
User{Address: Address{Street: "211 Street", State: "NY"}, FirstName: "Jimmy", LastName: "Stewart"},
User{Address: Address{Street: "311 Street", State: "NY"}, FirstName: "Jeff", LastName: "Jeffers"},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("address_state", "address_street", "firstname", "lastname") VALUES ('NY', '111 Street', 'Greg', 'Farley'), ('NY', '211 Street', 'Jimmy', 'Stewart'), ('NY', '311 Street', 'Jeff', 'Jeffers') []
Example (WithIgnoredEmbedded) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type Address struct {
Street string
State string
}
type User struct {
Address `db:"-"`
FirstName string
LastName string
}
ds := builder.Insert("user").Rows(
User{Address: Address{Street: "111 Street", State: "NY"}, FirstName: "Greg", LastName: "Farley"},
User{Address: Address{Street: "211 Street", State: "NY"}, FirstName: "Jimmy", LastName: "Stewart"},
User{Address: Address{Street: "311 Street", State: "NY"}, FirstName: "Jeff", LastName: "Jeffers"},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("firstname", "lastname") VALUES ('Greg', 'Farley'), ('Jimmy', 'Stewart'), ('Jeff', 'Jeffers') []
Example (WithNilEmbeddedPointer) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type Address struct {
Street string
State string
}
type User struct {
*Address
FirstName string
LastName string
}
ds := builder.Insert("user").Rows(
User{FirstName: "Greg", LastName: "Farley"},
User{FirstName: "Jimmy", LastName: "Stewart"},
User{FirstName: "Jeff", LastName: "Jeffers"},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("firstname", "lastname") VALUES ('Greg', 'Farley'), ('Jimmy', 'Stewart'), ('Jeff', 'Jeffers') []
Example (WithNoDbTag) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type item struct {
ID uint32 `builder:"skipinsert"`
Address string
Name string
}
insertSQL, args, _ := builder.Insert("items").
Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
).
ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.Insert("items").
Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
).
ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.Insert("items").
Rows([]item{
{Name: "Test1", Address: "111 Test Addr"},
{Name: "Test2", Address: "112 Test Addr"},
}).
ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') [] INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') [] INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') []
Example (WithbuilderDefaultIfEmptyTag) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type item struct {
ID uint32 `builder:"skipinsert"`
Address string
Name string `builder:"defaultifempty"`
}
insertSQL, args, _ := builder.Insert("items").
Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Address: "112 Test Addr"},
).
ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.Insert("items").
Rows([]item{
{Address: "111 Test Addr"},
{Name: "Test2", Address: "112 Test Addr"},
}).
ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', DEFAULT) [] INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', DEFAULT), ('112 Test Addr', 'Test2') []
Example (WithbuilderSkipInsertTag) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type item struct {
ID uint32 `builder:"skipinsert"`
Address string
Name string `builder:"skipinsert"`
}
insertSQL, args, _ := builder.Insert("items").
Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
).
ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.Insert("items").
Rows([]item{
{Name: "Test1", Address: "111 Test Addr"},
{Name: "Test2", Address: "112 Test Addr"},
}).
ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" ("address") VALUES ('111 Test Addr'), ('112 Test Addr') [] INSERT INTO "items" ("address") VALUES ('111 Test Addr'), ('112 Test Addr') []
func (*InsertDataset) SetDialect ¶
func (id *InsertDataset) SetDialect(dialect SQLDialect) *InsertDataset
Returns the current adapter on the dataset
func (*InsertDataset) SetError ¶
func (id *InsertDataset) SetError(err error) *InsertDataset
Set an error on the dataset if one has not already been set. This error will be returned by a future call to Error or as part of ToSQL. This can be used by end users to record errors while building up queries without having to track those separately.
func (*InsertDataset) ToSQL ¶
func (id *InsertDataset) ToSQL() (sql string, params []any, err error)
Generates the default INSERT statement. If Prepared has been called with true then the statement will not be interpolated. See examples. When using structs you may specify a column to be skipped in the insert, (e.g. id) by specifying a builder tag with `skipinsert`
type Item struct{
Id uint32 `db:"id" builder:"skipinsert"`
Name string `db:"name"`
}
rows: variable number arguments of either map[string]interface, Record, struct, or a single slice argument of the accepted types.
Errors:
- There is no INTO clause
- Different row types passed in, all rows must be of the same type
- Maps with different numbers of K/V pairs
- Rows of different lengths, (i.e. (Record{"name": "a"}, Record{"name": "a", "age": 10})
- Error generating SQL
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
type item struct {
ID uint32 `db:"id" builder:"skipinsert"`
Address string `db:"address"`
Name string `db:"name"`
}
insertSQL, args, _ := builder.Insert("items").Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
).ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.Insert("items").Rows(
builder.Record{"name": "Test1", "address": "111 Test Addr"},
builder.Record{"name": "Test2", "address": "112 Test Addr"},
).ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.Insert("items").Rows(
[]item{
{Name: "Test1", Address: "111 Test Addr"},
{Name: "Test2", Address: "112 Test Addr"},
}).ToSQL()
fmt.Println(insertSQL, args)
insertSQL, args, _ = builder.From("items").Insert().Rows(
[]builder.Record{
{"name": "Test1", "address": "111 Test Addr"},
{"name": "Test2", "address": "112 Test Addr"},
}).ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') [] INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') [] INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') [] INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') []
func (*InsertDataset) Vals ¶
func (id *InsertDataset) Vals(vals ...[]any) *InsertDataset
Manually set values to insert See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, _, _ := builder.Insert("test").
Cols("a", "b", "c").
Vals(
[]any{"a1", "b1", "c1"},
[]any{"a2", "b2", "c2"},
[]any{"a3", "b3", "c3"},
).
ToSQL()
fmt.Println(insertSQL)
insertSQL, _, _ = builder.Insert("test").
Cols("a", "b", "c").
Vals([]any{"a1", "b1", "c1"}).
Vals([]any{"a2", "b2", "c2"}).
Vals([]any{"a3", "b3", "c3"}).
ToSQL()
fmt.Println(insertSQL)
}
Output: INSERT INTO "test" ("a", "b", "c") VALUES ('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'), ('a3', 'b3', 'c3') INSERT INTO "test" ("a", "b", "c") VALUES ('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'), ('a3', 'b3', 'c3')
func (*InsertDataset) With ¶
func (id *InsertDataset) With(name string, subquery exp.Expression) *InsertDataset
Creates a WITH clause for a common table expression (CTE).
The name will be available to SELECT from in the associated query; and can optionally contain a list of column names "name(col1, col2, col3)".
The name will refer to the results of the specified subquery.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, _, _ := builder.Insert("foo").
With("other", builder.From("bar").Where(builder.C("id").Gt(10))).
FromQuery(builder.From("other")).
ToSQL()
fmt.Println(insertSQL)
}
Output: WITH other AS (SELECT * FROM "bar" WHERE ("id" > 10)) INSERT INTO "foo" SELECT * FROM "other"
func (*InsertDataset) WithDialect ¶
func (id *InsertDataset) WithDialect(dl string) *InsertDataset
Sets the adapter used to serialize values and create the SQL statement
func (*InsertDataset) WithRecursive ¶
func (id *InsertDataset) WithRecursive(name string, subquery exp.Expression) *InsertDataset
Creates a WITH RECURSIVE clause for a common table expression (CTE)
The name will be available to SELECT from in the associated query; and must contain a list of column names "name(col1, col2, col3)" for a recursive clause.
The name will refer to the results of the specified subquery. The subquery for a recursive query will always end with a UNION or UNION ALL with a clause that refers to the CTE by name.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/postgres"
)
func main() {
insertSQL, _, _ := builder.Insert("num_count").
WithRecursive("nums(x)",
builder.From().Select(builder.L("1")).
UnionAll(builder.From("nums").
Select(builder.L("x+1")).Where(builder.C("x").Lt(5))),
).
FromQuery(builder.From("nums")).
ToSQL()
fmt.Println(insertSQL)
}
Output: WITH RECURSIVE nums(x) AS (SELECT 1 UNION ALL (SELECT x+1 FROM "nums" WHERE ("x" < 5))) INSERT INTO "num_count" SELECT * FROM "nums"
type Op ¶
Example (BetweenComparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(builder.Ex{
"a": builder.Op{"between": builder.Range(1, 10)},
})
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"notBetween": builder.Range(1, 10)},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("a" BETWEEN 1 AND 10) [] SELECT * FROM "test" WHERE ("a" BETWEEN ? AND ?) [1 10] SELECT * FROM "test" WHERE ("a" NOT BETWEEN 1 AND 10) [] SELECT * FROM "test" WHERE ("a" NOT BETWEEN ? AND ?) [1 10]
Example (Comparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(builder.Ex{
"a": 10,
"b": builder.Op{"neq": 10},
"c": builder.Op{"gte": 10},
"d": builder.Op{"lt": 10},
"e": builder.Op{"lte": 10},
})
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (("a" = 10) AND ("b" != 10) AND ("c" >= 10) AND ("d" < 10) AND ("e" <= 10)) [] SELECT * FROM "test" WHERE (("a" = ?) AND ("b" != ?) AND ("c" >= ?) AND ("d" < ?) AND ("e" <= ?)) [10 10 10 10 10]
Example (InComparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// using an Ex expression map
ds := builder.From("test").Where(builder.Ex{
"a": builder.Op{"in": []string{"a", "b", "c"}},
})
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"notIn": []string{"a", "b", "c"}},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("a" IN ('a', 'b', 'c')) [] SELECT * FROM "test" WHERE ("a" IN (?, ?, ?)) [a b c] SELECT * FROM "test" WHERE ("a" NOT IN ('a', 'b', 'c')) [] SELECT * FROM "test" WHERE ("a" NOT IN (?, ?, ?)) [a b c]
Example (IsComparisons) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// using an Ex expression map
ds := builder.From("test").Where(builder.Ex{
"a": true,
})
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"is": true},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": false,
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"is": false},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": nil,
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"is": nil},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"isNot": true},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"isNot": false},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"isNot": nil},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("a" IS TRUE) [] SELECT * FROM "test" WHERE ("a" IS TRUE) [] SELECT * FROM "test" WHERE ("a" IS TRUE) [] SELECT * FROM "test" WHERE ("a" IS TRUE) [] SELECT * FROM "test" WHERE ("a" IS FALSE) [] SELECT * FROM "test" WHERE ("a" IS FALSE) [] SELECT * FROM "test" WHERE ("a" IS FALSE) [] SELECT * FROM "test" WHERE ("a" IS FALSE) [] SELECT * FROM "test" WHERE ("a" IS NULL) [] SELECT * FROM "test" WHERE ("a" IS NULL) [] SELECT * FROM "test" WHERE ("a" IS NULL) [] SELECT * FROM "test" WHERE ("a" IS NULL) [] SELECT * FROM "test" WHERE ("a" IS NOT TRUE) [] SELECT * FROM "test" WHERE ("a" IS NOT TRUE) [] SELECT * FROM "test" WHERE ("a" IS NOT FALSE) [] SELECT * FROM "test" WHERE ("a" IS NOT FALSE) [] SELECT * FROM "test" WHERE ("a" IS NOT NULL) [] SELECT * FROM "test" WHERE ("a" IS NOT NULL) []
Example (LikeComparisons) ¶
package main
import (
"fmt"
"regexp"
"github.com/Tooooommy/builder/v9"
)
func main() {
// using an Ex expression map
ds := builder.From("test").Where(builder.Ex{
"a": builder.Op{"like": "%a%"},
})
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"like": regexp.MustCompile("[ab]")},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"iLike": "%a%"},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"iLike": regexp.MustCompile("[ab]")},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"notLike": "%a%"},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"notLike": regexp.MustCompile("[ab]")},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"notILike": "%a%"},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
ds = builder.From("test").Where(builder.Ex{
"a": builder.Op{"notILike": regexp.MustCompile("[ab]")},
})
sql, args, _ = ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE ("a" LIKE '%a%') [] SELECT * FROM "test" WHERE ("a" LIKE ?) [%a%] SELECT * FROM "test" WHERE ("a" ~ '[ab]') [] SELECT * FROM "test" WHERE ("a" ~ ?) [[ab]] SELECT * FROM "test" WHERE ("a" ILIKE '%a%') [] SELECT * FROM "test" WHERE ("a" ILIKE ?) [%a%] SELECT * FROM "test" WHERE ("a" ~* '[ab]') [] SELECT * FROM "test" WHERE ("a" ~* ?) [[ab]] SELECT * FROM "test" WHERE ("a" NOT LIKE '%a%') [] SELECT * FROM "test" WHERE ("a" NOT LIKE ?) [%a%] SELECT * FROM "test" WHERE ("a" !~ '[ab]') [] SELECT * FROM "test" WHERE ("a" !~ ?) [[ab]] SELECT * FROM "test" WHERE ("a" NOT ILIKE '%a%') [] SELECT * FROM "test" WHERE ("a" NOT ILIKE ?) [%a%] SELECT * FROM "test" WHERE ("a" !~* '[ab]') [] SELECT * FROM "test" WHERE ("a" !~* ?) [[ab]]
Example (WithMultipleKeys) ¶
When using a single op with multiple keys they are ORed together
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("items").Where(builder.Ex{
"col1": builder.Op{"is": nil, "eq": 10},
})
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "items" WHERE (("col1" = 10) OR ("col1" IS NULL)) [] SELECT * FROM "items" WHERE (("col1" = ?) OR ("col1" IS NULL)) [10]
type Record ¶
Example (Insert) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.Insert("test")
records := []builder.Record{
{"col1": 1, "col2": "foo"},
{"col1": 2, "col2": "bar"},
}
sql, args, _ := ds.Rows(records).ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).Rows(records).ToSQL()
fmt.Println(sql, args)
}
Output: INSERT INTO "test" ("col1", "col2") VALUES (1, 'foo'), (2, 'bar') [] INSERT INTO "test" ("col1", "col2") VALUES (?, ?), (?, ?) [1 foo 2 bar]
Example (Update) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.Update("test")
update := builder.Record{"col1": 1, "col2": "foo"}
sql, args, _ := ds.Set(update).ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).Set(update).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "test" SET "col1"=1,"col2"='foo' [] UPDATE "test" SET "col1"=?,"col2"=? [1 foo]
type SQLDialect ¶
type SQLDialect interface {
Dialect() string
ToSelectSQL(b sb.SQLBuilder, clauses exp.SelectClauses)
ToUpdateSQL(b sb.SQLBuilder, clauses exp.UpdateClauses)
ToInsertSQL(b sb.SQLBuilder, clauses exp.InsertClauses)
ToDeleteSQL(b sb.SQLBuilder, clauses exp.DeleteClauses)
ToTruncateSQL(b sb.SQLBuilder, clauses exp.TruncateClauses)
}
An adapter interface to be used by a Dataset to generate SQL for a specific dialect. See DefaultAdapter for a concrete implementation and examples.
func GetDialect ¶
func GetDialect(name string) SQLDialect
type SQLDialectOptions ¶
type SQLDialectOptions = sqlgen.SQLDialectOptions
type SelectDataset ¶
type SelectDataset struct {
// contains filtered or unexported fields
}
Dataset for creating and/or executing SELECT SQL statements.
Example ¶
package main
import (
"fmt"
"regexp"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Select(builder.COUNT("*")).
InnerJoin(builder.T("test2"), builder.On(builder.I("test.fkey").Eq(builder.I("test2.id")))).
LeftJoin(builder.T("test3"), builder.On(builder.I("test2.fkey").Eq(builder.I("test3.id")))).
Where(
builder.Ex{
"test.name": builder.Op{
"like": regexp.MustCompile("^[ab]"),
},
"test2.amount": builder.Op{
"isNot": nil,
},
},
builder.ExOr{
"test3.id": nil,
"test3.status": []string{"passed", "active", "registered"},
}).
Order(builder.I("test.created").Desc().NullsLast()).
GroupBy(builder.I("test.user_id")).
Having(builder.AVG("test3.age").Gt(10))
sql, args, _ := ds.ToSQL()
fmt.Println(sql, args)
sql, args, _ = ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
// nolint:lll // SQL statements are long
Output:
func From ¶
func From(table ...any) *SelectDataset
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("test").ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" []
func Select ¶
func Select(cols ...any) *SelectDataset
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.Select(builder.L("NOW()")).ToSQL()
fmt.Println(sql)
}
Output: SELECT NOW()
func (*SelectDataset) AppendSQL ¶
func (sd *SelectDataset) AppendSQL(b sb.SQLBuilder)
Appends this Dataset's SELECT statement to the SQLBuilder This is used internally for sub-selects by the dialect
func (*SelectDataset) As ¶
func (sd *SelectDataset) As(alias string) *SelectDataset
Sets the alias for this dataset. This is typically used when using a Dataset as a subselect. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").As("t")
sql, _, _ := builder.From(ds).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM (SELECT * FROM "test") AS "t"
func (*SelectDataset) ClearLimit ¶
func (sd *SelectDataset) ClearLimit() *SelectDataset
Removes the LIMIT clause.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Limit(10)
sql, _, _ := ds.ClearLimit().ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test"
func (*SelectDataset) ClearOffset ¶
func (sd *SelectDataset) ClearOffset() *SelectDataset
Removes the OFFSET clause from the Dataset
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Offset(2)
sql, _, _ := ds.
ClearOffset().
ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test"
func (*SelectDataset) ClearOrder ¶
func (sd *SelectDataset) ClearOrder() *SelectDataset
Removes the ORDER BY clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Order(builder.C("a").Asc())
sql, _, _ := ds.ClearOrder().ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test"
func (*SelectDataset) ClearSelect ¶
func (sd *SelectDataset) ClearSelect() *SelectDataset
Resets to SELECT *. If the SelectDistinct or Distinct was used the returned Dataset will have the the dataset set to SELECT *. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select("a", "b")
sql, _, _ := ds.ClearSelect().ToSQL()
fmt.Println(sql)
ds = builder.From("test").Select("a", "b").Distinct()
sql, _, _ = ds.ClearSelect().ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" SELECT * FROM "test"
func (*SelectDataset) ClearWhere ¶
func (sd *SelectDataset) ClearWhere() *SelectDataset
Removes the WHERE clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Lt(10),
builder.C("c").IsNull(),
),
),
)
sql, _, _ := ds.ClearWhere().ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test"
func (*SelectDataset) ClearWindow ¶
func (sd *SelectDataset) ClearWindow() *SelectDataset
Sets the WINDOW clauses
func (*SelectDataset) CompoundFromSelf ¶
func (sd *SelectDataset) CompoundFromSelf() *SelectDataset
Used internally to determine if the dataset needs to use iteself as a source. If the dataset has an order or limit it will select from itself
func (*SelectDataset) Count ¶
func (sd *SelectDataset) Count() (int64, error)
Generates the SELECT COUNT(*) sql for this dataset and uses Exec#QueryRow to scan the result into an int64.
Example ¶
package main
import (
"fmt"
"os"
"time"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var (
dropUserRoleTable = `
DROP TABLE IF EXISTS user_role;
`
dropBuilderUserTable = `
DROP TABLE IF EXISTS builder_user;
`
createBuilderUserTable = `
CREATE TABLE builder_user (
id bigint AUTO_INCREMENT,
first_name varchar(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
createUserRoleTable = `
CREATE TABLE user_role (
id bigint AUTO_INCREMENT,
user_id bigint DEFAULT 0,
name varchar(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
tables = []string{dropUserRoleTable, dropBuilderUserTable, createBuilderUserTable, createUserRoleTable}
)
const defaultDBURI = "tommy:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true"
var builderDB *builder.Database
func getDB() *builder.Database {
if builderDB == nil {
dbURI := os.Getenv("MY_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
conn := sqlx.NewSqlConn("mysql", dbURI)
builderDB = builder.New("mysql", conn)
}
for _, table := range tables {
if _, err := builderDB.Exec(table); err != nil {
panic(err)
}
}
type builderUser struct {
ID int64 `db:"id" builder:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
type userRole struct {
ID int64 `db:"id" builder:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
users := []builderUser{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
roles := []userRole{
{Name: "Admin"},
{Name: "Manager"},
{Name: "Manager"},
{Name: "User"},
}
for index, user := range users {
ret, err := builderDB.Insert("builder_user").Rows(user).Exec()
if err != nil {
panic(err)
}
roles[index].UserID, err = ret.LastInsertId()
if err != nil {
panic(err)
}
}
_, err := builderDB.Insert("user_role").Rows(roles).Exec()
if err != nil {
panic(err)
}
return builderDB
}
func main() {
count, err := getDB().From("builder_user").Count()
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("Count is %d", count)
}
Output: Count is 4
func (*SelectDataset) CountContext ¶
func (sd *SelectDataset) CountContext(ctx context.Context) (int64, error)
Generates the SELECT COUNT(*) sql for this dataset and uses Exec#QueryRowContext to scan the result into an int64.
func (*SelectDataset) CrossJoin ¶
func (sd *SelectDataset) CrossJoin(table exp.Expression) *SelectDataset
Adds a CROSS JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").CrossJoin(builder.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").CrossJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").CrossJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" CROSS JOIN "test2" SELECT * FROM "test" CROSS JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) SELECT * FROM "test" CROSS JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
func (*SelectDataset) Delete ¶
func (sd *SelectDataset) Delete() *DeleteDataset
Creates a new DeleteDataset using the FROM of this dataset. This method will also copy over the `WITH`, `WHERE`, `ORDER , and `LIMIT`
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("items").Delete().ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("items").
Where(builder.Ex{"id": builder.Op{"gt": 10}}).
Delete().
ToSQL()
fmt.Println(sql, args)
}
Output: DELETE FROM "items" [] DELETE FROM "items" WHERE ("id" > 10) []
func (*SelectDataset) Dialect ¶
func (sd *SelectDataset) Dialect() SQLDialect
Returns the current adapter on the dataset
func (*SelectDataset) Distinct ¶
func (sd *SelectDataset) Distinct(on ...any) *SelectDataset
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select("a", "b").Distinct().ToSQL()
fmt.Println(sql)
}
Output: SELECT DISTINCT "a", "b" FROM "test"
Example (On) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Distinct("a").ToSQL()
fmt.Println(sql)
}
Output: SELECT DISTINCT ON ("a") * FROM "test"
Example (OnCoalesce) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Distinct(builder.COALESCE(builder.C("a"), "empty")).ToSQL()
fmt.Println(sql)
}
Output: SELECT DISTINCT ON (COALESCE("a", 'empty')) * FROM "test"
Example (OnWithLiteral) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Distinct(builder.L("COALESCE(?, ?)", builder.C("a"), "empty")).ToSQL()
fmt.Println(sql)
}
Output: SELECT DISTINCT ON (COALESCE("a", 'empty')) * FROM "test"
func (*SelectDataset) Error ¶
func (sd *SelectDataset) Error() error
Get any error that has been set or nil if no error has been set.
func (*SelectDataset) Expression ¶
func (sd *SelectDataset) Expression() exp.Expression
func (*SelectDataset) ForKeyShare ¶
func (sd *SelectDataset) ForKeyShare(waitOption exp.WaitOption, of ...exp.IdentifierExpression) *SelectDataset
Adds a FOR KEY SHARE clause. See examples.
func (*SelectDataset) ForNoKeyUpdate ¶
func (sd *SelectDataset) ForNoKeyUpdate(waitOption exp.WaitOption, of ...exp.IdentifierExpression) *SelectDataset
Adds a FOR NO KEY UPDATE clause. See examples.
func (*SelectDataset) ForShare ¶
func (sd *SelectDataset) ForShare(waitOption exp.WaitOption, of ...exp.IdentifierExpression) *SelectDataset
Adds a FOR SHARE clause. See examples.
func (*SelectDataset) ForUpdate ¶
func (sd *SelectDataset) ForUpdate(waitOption exp.WaitOption, of ...exp.IdentifierExpression) *SelectDataset
Adds a FOR UPDATE clause. See examples.
func (*SelectDataset) From ¶
func (sd *SelectDataset) From(from ...any) *SelectDataset
Adds a FROM clause. This return a new dataset with the original sources replaced. See examples. You can pass in the following.
string: Will automatically be turned into an identifier Dataset: Will be added as a sub select. If the Dataset is not aliased it will automatically be aliased LiteralExpression: (See Literal) Will use the literal SQL
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test")
sql, _, _ := ds.From("test2").ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test2"
Example (WithAliasedDataset) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test")
fromDs := ds.Where(builder.C("age").Gt(10))
sql, _, _ := ds.From(fromDs.As("test2")).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM (SELECT * FROM "test" WHERE ("age" > 10)) AS "test2"
Example (WithDataset) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test")
fromDs := ds.Where(builder.C("age").Gt(10))
sql, _, _ := ds.From(fromDs).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM (SELECT * FROM "test" WHERE ("age" > 10)) AS "t1"
func (*SelectDataset) FromSelf ¶
func (sd *SelectDataset) FromSelf() *SelectDataset
Returns a new Dataset with the current one as an source. If the current Dataset is not aliased (See Dataset#As) then it will automatically be aliased. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").FromSelf().ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").As("my_test_table").FromSelf().ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM (SELECT * FROM "test") AS "t1" SELECT * FROM (SELECT * FROM "test") AS "my_test_table"
func (*SelectDataset) FullJoin ¶
func (sd *SelectDataset) FullJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
Adds a FULL JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").FullJoin(
builder.T("test2"),
builder.On(builder.Ex{
"test.fkey": builder.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").FullJoin(
builder.T("test2"),
builder.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").FullJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
builder.On(builder.I("test.fkey").Eq(builder.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").FullJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
builder.On(builder.I("test.fkey").Eq(builder.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" FULL JOIN "test2" ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" FULL JOIN "test2" USING ("common_column") SELECT * FROM "test" FULL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" FULL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
func (*SelectDataset) FullOuterJoin ¶
func (sd *SelectDataset) FullOuterJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
Adds a FULL OUTER JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").FullOuterJoin(
builder.T("test2"),
builder.On(builder.Ex{
"test.fkey": builder.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").FullOuterJoin(
builder.T("test2"),
builder.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").FullOuterJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
builder.On(builder.I("test.fkey").Eq(builder.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").FullOuterJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
builder.On(builder.I("test.fkey").Eq(builder.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" FULL OUTER JOIN "test2" ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" FULL OUTER JOIN "test2" USING ("common_column") SELECT * FROM "test" FULL OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" FULL OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
func (*SelectDataset) GetAs ¶
func (sd *SelectDataset) GetAs() exp.IdentifierExpression
Returns the alias value as an identiier expression
func (*SelectDataset) GetClauses ¶
func (sd *SelectDataset) GetClauses() exp.SelectClauses
Returns the current clauses on the dataset.
func (*SelectDataset) GroupBy ¶
func (sd *SelectDataset) GroupBy(groupBy ...any) *SelectDataset
Adds a GROUP BY clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").
Select(builder.SUM("income").As("income_sum")).
GroupBy("age").
ToSQL()
fmt.Println(sql)
}
Output: SELECT SUM("income") AS "income_sum" FROM "test" GROUP BY "age"
func (*SelectDataset) GroupByAppend ¶
func (sd *SelectDataset) GroupByAppend(groupBy ...any) *SelectDataset
Adds more columns to the current GROUP BY clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Select(builder.SUM("income").As("income_sum")).
GroupBy("age")
sql, _, _ := ds.
GroupByAppend("job").
ToSQL()
fmt.Println(sql)
// the original dataset group by does not change
sql, _, _ = ds.ToSQL()
fmt.Println(sql)
}
Output: SELECT SUM("income") AS "income_sum" FROM "test" GROUP BY "age", "job" SELECT SUM("income") AS "income_sum" FROM "test" GROUP BY "age"
func (*SelectDataset) Having ¶
func (sd *SelectDataset) Having(expressions ...exp.Expression) *SelectDataset
Adds a HAVING clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Having(builder.SUM("income").Gt(1000)).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").GroupBy("age").Having(builder.SUM("income").Gt(1000)).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" HAVING (SUM("income") > 1000) SELECT * FROM "test" GROUP BY "age" HAVING (SUM("income") > 1000)
func (*SelectDataset) InnerJoin ¶
func (sd *SelectDataset) InnerJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
Adds an INNER JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").InnerJoin(
builder.T("test2"),
builder.On(builder.Ex{
"test.fkey": builder.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").InnerJoin(
builder.T("test2"),
builder.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").InnerJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
builder.On(builder.I("test.fkey").Eq(builder.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").InnerJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
builder.On(builder.I("test.fkey").Eq(builder.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" INNER JOIN "test2" ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" INNER JOIN "test2" USING ("common_column") SELECT * FROM "test" INNER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" INNER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
func (*SelectDataset) Insert ¶
func (sd *SelectDataset) Insert() *InsertDataset
Creates a new InsertDataset using the FROM of this dataset. This method will also copy over the `WITH` clause to the insert.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
type item struct {
ID uint32 `db:"id" builder:"skipinsert"`
Address string `db:"address"`
Name string `db:"name"`
}
sql, args, _ := builder.From("items").Insert().Rows(
item{Name: "Test1", Address: "111 Test Addr"},
item{Name: "Test2", Address: "112 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("items").Insert().Rows(
builder.Record{"name": "Test1", "address": "111 Test Addr"},
builder.Record{"name": "Test2", "address": "112 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("items").Insert().Rows(
[]item{
{Name: "Test1", Address: "111 Test Addr"},
{Name: "Test2", Address: "112 Test Addr"},
}).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("items").Insert().Rows(
[]builder.Record{
{"name": "Test1", "address": "111 Test Addr"},
{"name": "Test2", "address": "112 Test Addr"},
}).ToSQL()
fmt.Println(sql, args)
}
Output: INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') [] INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') [] INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') [] INSERT INTO "items" ("address", "name") VALUES ('111 Test Addr', 'Test1'), ('112 Test Addr', 'Test2') []
func (*SelectDataset) Intersect ¶
func (sd *SelectDataset) Intersect(other *SelectDataset) *SelectDataset
Creates an INTERSECT statement with another dataset. If this or the other dataset has a limit or offset it will use that dataset as a subselect in the FROM clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").
Intersect(builder.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").
Limit(1).
Intersect(builder.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").
Limit(1).
Intersect(builder.From("test2").
Order(builder.C("id").Desc())).
ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" INTERSECT (SELECT * FROM "test2") SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" INTERSECT (SELECT * FROM "test2") SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" INTERSECT (SELECT * FROM (SELECT * FROM "test2" ORDER BY "id" DESC) AS "t1")
func (*SelectDataset) IntersectAll ¶
func (sd *SelectDataset) IntersectAll(other *SelectDataset) *SelectDataset
Creates an INTERSECT ALL statement with another dataset. If this or the other dataset has a limit or offset it will use that dataset as a subselect in the FROM clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").
IntersectAll(builder.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").
Limit(1).
IntersectAll(builder.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").
Limit(1).
IntersectAll(builder.From("test2").
Order(builder.C("id").Desc())).
ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" INTERSECT ALL (SELECT * FROM "test2") SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" INTERSECT ALL (SELECT * FROM "test2") SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" INTERSECT ALL (SELECT * FROM (SELECT * FROM "test2" ORDER BY "id" DESC) AS "t1")
func (*SelectDataset) IsPrepared ¶
func (sd *SelectDataset) IsPrepared() bool
func (*SelectDataset) Join ¶
func (sd *SelectDataset) Join(table exp.Expression, condition exp.JoinCondition) *SelectDataset
Alias to InnerJoin. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Join(
builder.T("test2"),
builder.On(builder.Ex{"test.fkey": builder.I("test2.Id")}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Join(builder.T("test2"), builder.Using("common_column")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Join(
builder.From("test2").Where(builder.C("amount").Gt(0)),
builder.On(builder.I("test.fkey").Eq(builder.T("test2").Col("Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").Join(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
builder.On(builder.T("test").Col("fkey").Eq(builder.T("t").Col("Id"))),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" INNER JOIN "test2" ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" INNER JOIN "test2" USING ("common_column") SELECT * FROM "test" INNER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" INNER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
func (*SelectDataset) LeftJoin ¶
func (sd *SelectDataset) LeftJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
Adds a LEFT JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").LeftJoin(
builder.T("test2"),
builder.On(builder.Ex{
"test.fkey": builder.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").LeftJoin(
builder.T("test2"),
builder.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").LeftJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
builder.On(builder.I("test.fkey").Eq(builder.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").LeftJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
builder.On(builder.I("test.fkey").Eq(builder.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" LEFT JOIN "test2" ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" LEFT JOIN "test2" USING ("common_column") SELECT * FROM "test" LEFT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" LEFT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
func (*SelectDataset) LeftOuterJoin ¶
func (sd *SelectDataset) LeftOuterJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
Adds a LEFT OUTER JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").LeftOuterJoin(
builder.T("test2"),
builder.On(builder.Ex{
"test.fkey": builder.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").LeftOuterJoin(
builder.T("test2"),
builder.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").LeftOuterJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
builder.On(builder.I("test.fkey").Eq(builder.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").LeftOuterJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
builder.On(builder.I("test.fkey").Eq(builder.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" LEFT OUTER JOIN "test2" ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" LEFT OUTER JOIN "test2" USING ("common_column") SELECT * FROM "test" LEFT OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" LEFT OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
func (*SelectDataset) Limit ¶
func (sd *SelectDataset) Limit(limit uint) *SelectDataset
Adds a LIMIT clause. If the LIMIT is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Limit(10)
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" LIMIT 10
func (*SelectDataset) LimitAll ¶
func (sd *SelectDataset) LimitAll() *SelectDataset
Adds a LIMIT ALL clause. If the LIMIT is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").LimitAll()
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" LIMIT ALL
func (*SelectDataset) NaturalFullJoin ¶
func (sd *SelectDataset) NaturalFullJoin(table exp.Expression) *SelectDataset
Adds a NATURAL FULL JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").NaturalFullJoin(builder.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").NaturalFullJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").NaturalFullJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" NATURAL FULL JOIN "test2" SELECT * FROM "test" NATURAL FULL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) SELECT * FROM "test" NATURAL FULL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
func (*SelectDataset) NaturalJoin ¶
func (sd *SelectDataset) NaturalJoin(table exp.Expression) *SelectDataset
Adds a NATURAL JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").NaturalJoin(builder.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").NaturalJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").NaturalJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" NATURAL JOIN "test2" SELECT * FROM "test" NATURAL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) SELECT * FROM "test" NATURAL JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
func (*SelectDataset) NaturalLeftJoin ¶
func (sd *SelectDataset) NaturalLeftJoin(table exp.Expression) *SelectDataset
Adds a NATURAL LEFT JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").NaturalLeftJoin(builder.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").NaturalLeftJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").NaturalLeftJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" NATURAL LEFT JOIN "test2" SELECT * FROM "test" NATURAL LEFT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) SELECT * FROM "test" NATURAL LEFT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
func (*SelectDataset) NaturalRightJoin ¶
func (sd *SelectDataset) NaturalRightJoin(table exp.Expression) *SelectDataset
Adds a NATURAL RIGHT JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").NaturalRightJoin(builder.T("test2")).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").NaturalRightJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").NaturalRightJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" NATURAL RIGHT JOIN "test2" SELECT * FROM "test" NATURAL RIGHT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) SELECT * FROM "test" NATURAL RIGHT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t"
func (*SelectDataset) Offset ¶
func (sd *SelectDataset) Offset(offset uint) *SelectDataset
Adds an OFFSET clause. If the OFFSET is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Offset(2)
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" OFFSET 2
func (*SelectDataset) Order ¶
func (sd *SelectDataset) Order(order ...exp.OrderedExpression) *SelectDataset
Adds a ORDER clause. If the ORDER is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Order(builder.C("a").Asc())
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" ORDER BY "a" ASC
Example (CaseExpression) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Order(builder.Case().When(builder.C("num").Gt(10), 0).Else(1).Asc())
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" ORDER BY CASE WHEN ("num" > 10) THEN 0 ELSE 1 END ASC
func (*SelectDataset) OrderAppend ¶
func (sd *SelectDataset) OrderAppend(order ...exp.OrderedExpression) *SelectDataset
Adds a more columns to the current ORDER BY clause. If no order has be previously specified it is the same as calling Order. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Order(builder.C("a").Asc())
sql, _, _ := ds.OrderAppend(builder.C("b").Desc().NullsLast()).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" ORDER BY "a" ASC, "b" DESC NULLS LAST
func (*SelectDataset) OrderPrepend ¶
func (sd *SelectDataset) OrderPrepend(order ...exp.OrderedExpression) *SelectDataset
Adds a more columns to the beginning of the current ORDER BY clause. If no order has be previously specified it is the same as calling Order. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Order(builder.C("a").Asc())
sql, _, _ := ds.OrderPrepend(builder.C("b").Desc().NullsLast()).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" ORDER BY "b" DESC NULLS LAST, "a" ASC
func (*SelectDataset) Pluck ¶
func (sd *SelectDataset) Pluck(v any, col string) error
Generates the SELECT sql only selecting the passed in column and uses Exec#QueryRows to scan the result into a slice of primitive values.
i: A slice of primitive values
col: The column to select when generative the SQL
Example ¶
package main
import (
"fmt"
"os"
"time"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var (
dropUserRoleTable = `
DROP TABLE IF EXISTS user_role;
`
dropBuilderUserTable = `
DROP TABLE IF EXISTS builder_user;
`
createBuilderUserTable = `
CREATE TABLE builder_user (
id bigint AUTO_INCREMENT,
first_name varchar(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
createUserRoleTable = `
CREATE TABLE user_role (
id bigint AUTO_INCREMENT,
user_id bigint DEFAULT 0,
name varchar(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
tables = []string{dropUserRoleTable, dropBuilderUserTable, createBuilderUserTable, createUserRoleTable}
)
const defaultDBURI = "tommy:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true"
var builderDB *builder.Database
func getDB() *builder.Database {
if builderDB == nil {
dbURI := os.Getenv("MY_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
conn := sqlx.NewSqlConn("mysql", dbURI)
builderDB = builder.New("mysql", conn)
}
for _, table := range tables {
if _, err := builderDB.Exec(table); err != nil {
panic(err)
}
}
type builderUser struct {
ID int64 `db:"id" builder:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
type userRole struct {
ID int64 `db:"id" builder:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
users := []builderUser{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
roles := []userRole{
{Name: "Admin"},
{Name: "Manager"},
{Name: "Manager"},
{Name: "User"},
}
for index, user := range users {
ret, err := builderDB.Insert("builder_user").Rows(user).Exec()
if err != nil {
panic(err)
}
roles[index].UserID, err = ret.LastInsertId()
if err != nil {
panic(err)
}
}
_, err := builderDB.Insert("user_role").Rows(roles).Exec()
if err != nil {
panic(err)
}
return builderDB
}
func main() {
var lastNames []string
if err := getDB().From("builder_user").Pluck(&lastNames, "last_name"); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("LastNames = %+v", lastNames)
}
Output: LastNames = [Yukon Yukon Yukon Doe]
func (*SelectDataset) PluckContext ¶
Generates the SELECT sql only selecting the passed in column and uses Exec#QueryRowsContext to scan the result into a slice of primitive values.
i: A slice of primitive values
col: The column to select when generative the SQL
func (*SelectDataset) Prepared ¶
func (sd *SelectDataset) Prepared(prepared bool) *SelectDataset
Set the parameter interpolation behavior. See examples
prepared: If true the dataset WILL NOT interpolate the parameters.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("items").Prepared(true).Where(builder.Ex{
"col1": "a",
"col2": 1,
"col3": true,
"col4": false,
"col5": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql, args)
// nolint:lll // sql statements are long
Output:
func (*SelectDataset) QueryRow ¶
func (sd *SelectDataset) QueryRow(v any) error
Generates the SELECT sql for this dataset and uses Exec#QueryRow to scan the result into a slice of structs
QueryRow will only select the columns that can be scanned in to the struct unless you have explicitly selected certain columns. See examples.
i: A pointer to a structs
Example ¶
package main
import (
"fmt"
"os"
"time"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var (
dropUserRoleTable = `
DROP TABLE IF EXISTS user_role;
`
dropBuilderUserTable = `
DROP TABLE IF EXISTS builder_user;
`
createBuilderUserTable = `
CREATE TABLE builder_user (
id bigint AUTO_INCREMENT,
first_name varchar(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
createUserRoleTable = `
CREATE TABLE user_role (
id bigint AUTO_INCREMENT,
user_id bigint DEFAULT 0,
name varchar(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
tables = []string{dropUserRoleTable, dropBuilderUserTable, createBuilderUserTable, createUserRoleTable}
)
const defaultDBURI = "tommy:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true"
var builderDB *builder.Database
func getDB() *builder.Database {
if builderDB == nil {
dbURI := os.Getenv("MY_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
conn := sqlx.NewSqlConn("mysql", dbURI)
builderDB = builder.New("mysql", conn)
}
for _, table := range tables {
if _, err := builderDB.Exec(table); err != nil {
panic(err)
}
}
type builderUser struct {
ID int64 `db:"id" builder:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
type userRole struct {
ID int64 `db:"id" builder:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
users := []builderUser{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
roles := []userRole{
{Name: "Admin"},
{Name: "Manager"},
{Name: "Manager"},
{Name: "User"},
}
for index, user := range users {
ret, err := builderDB.Insert("builder_user").Rows(user).Exec()
if err != nil {
panic(err)
}
roles[index].UserID, err = ret.LastInsertId()
if err != nil {
panic(err)
}
}
_, err := builderDB.Insert("user_role").Rows(roles).Exec()
if err != nil {
panic(err)
}
return builderDB
}
func main() {
type User struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
db := getDB()
findUserByName := func(name string) {
var user User
ds := db.From("builder_user").Where(builder.C("first_name").Eq(name))
err := ds.QueryRowPartial(&user)
switch {
case err != nil:
fmt.Println(err.Error())
default:
fmt.Printf("Found user: %+v\n", user)
}
}
findUserByName("Bob")
findUserByName("Zeb")
}
Output: Found user: {FirstName:Bob LastName:Yukon} sql: no rows in result set
Example (WithJoinAutoSelect) ¶
In this example we create a new struct that has two structs that represent two table the User and Role fields are tagged with the table name
package main
import (
"fmt"
"os"
"time"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var (
dropUserRoleTable = `
DROP TABLE IF EXISTS user_role;
`
dropBuilderUserTable = `
DROP TABLE IF EXISTS builder_user;
`
createBuilderUserTable = `
CREATE TABLE builder_user (
id bigint AUTO_INCREMENT,
first_name varchar(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
createUserRoleTable = `
CREATE TABLE user_role (
id bigint AUTO_INCREMENT,
user_id bigint DEFAULT 0,
name varchar(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
tables = []string{dropUserRoleTable, dropBuilderUserTable, createBuilderUserTable, createUserRoleTable}
)
const defaultDBURI = "tommy:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true"
var builderDB *builder.Database
func getDB() *builder.Database {
if builderDB == nil {
dbURI := os.Getenv("MY_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
conn := sqlx.NewSqlConn("mysql", dbURI)
builderDB = builder.New("mysql", conn)
}
for _, table := range tables {
if _, err := builderDB.Exec(table); err != nil {
panic(err)
}
}
type builderUser struct {
ID int64 `db:"id" builder:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
type userRole struct {
ID int64 `db:"id" builder:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
users := []builderUser{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
roles := []userRole{
{Name: "Admin"},
{Name: "Manager"},
{Name: "Manager"},
{Name: "User"},
}
for index, user := range users {
ret, err := builderDB.Insert("builder_user").Rows(user).Exec()
if err != nil {
panic(err)
}
roles[index].UserID, err = ret.LastInsertId()
if err != nil {
panic(err)
}
}
_, err := builderDB.Insert("user_role").Rows(roles).Exec()
if err != nil {
panic(err)
}
return builderDB
}
func main() {
type Role struct {
UserID uint64 `db:"user_id"`
Name string `db:"name"`
}
type User struct {
ID uint64 `db:"id"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
type UserAndRole struct {
User // tag as the "builder_user" table
Role // tag as "user_role" table
}
db := getDB()
findUserAndRoleByName := func(name string) {
var userAndRole UserAndRole
ds := db.
From("builder_user").
Join(
builder.T("user_role"),
builder.On(builder.I("builder_user.id").Eq(builder.I("user_role.user_id"))),
).
Where(builder.C("first_name").Eq(name))
err := ds.QueryRow(&userAndRole)
switch {
case err != nil:
fmt.Println(err.Error())
default:
fmt.Printf("Found user and role: %+v\n", userAndRole)
}
}
findUserAndRoleByName("Bob")
findUserAndRoleByName("Zeb")
}
Output: Found user and role: {User:{ID:1 FirstName:Bob LastName:Yukon} Role:{UserID:1 Name:Admin}} sql: no rows in result set
func (*SelectDataset) QueryRowCtx ¶
func (sd *SelectDataset) QueryRowCtx(ctx context.Context, v any) error
Generates the SELECT sql for this dataset and uses Exec#QueryRowContext to scan the result into a slice of structs
QueryRowContext will only select the columns that can be scanned in to the struct unless you have explicitly selected certain columns. See examples.
i: A pointer to a structs
func (*SelectDataset) QueryRowPartial ¶
func (sd *SelectDataset) QueryRowPartial(v any) error
Generates the SELECT sql for this dataset and uses Exec#QueryRow to scan the result into a slice of structs
QueryRow will only select the columns that can be scanned in to the struct unless you have explicitly selected certain columns. See examples.
i: A pointer to a structs
Example ¶
package main
import (
"fmt"
"os"
"time"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var (
dropUserRoleTable = `
DROP TABLE IF EXISTS user_role;
`
dropBuilderUserTable = `
DROP TABLE IF EXISTS builder_user;
`
createBuilderUserTable = `
CREATE TABLE builder_user (
id bigint AUTO_INCREMENT,
first_name varchar(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
createUserRoleTable = `
CREATE TABLE user_role (
id bigint AUTO_INCREMENT,
user_id bigint DEFAULT 0,
name varchar(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
tables = []string{dropUserRoleTable, dropBuilderUserTable, createBuilderUserTable, createUserRoleTable}
)
const defaultDBURI = "tommy:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true"
var builderDB *builder.Database
func getDB() *builder.Database {
if builderDB == nil {
dbURI := os.Getenv("MY_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
conn := sqlx.NewSqlConn("mysql", dbURI)
builderDB = builder.New("mysql", conn)
}
for _, table := range tables {
if _, err := builderDB.Exec(table); err != nil {
panic(err)
}
}
type builderUser struct {
ID int64 `db:"id" builder:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
type userRole struct {
ID int64 `db:"id" builder:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
users := []builderUser{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
roles := []userRole{
{Name: "Admin"},
{Name: "Manager"},
{Name: "Manager"},
{Name: "User"},
}
for index, user := range users {
ret, err := builderDB.Insert("builder_user").Rows(user).Exec()
if err != nil {
panic(err)
}
roles[index].UserID, err = ret.LastInsertId()
if err != nil {
panic(err)
}
}
_, err := builderDB.Insert("user_role").Rows(roles).Exec()
if err != nil {
panic(err)
}
return builderDB
}
func main() {
db := getDB()
findUserIDByName := func(name string) {
var id int64
ds := db.From("builder_user").
Select("id").
Where(builder.C("first_name").Eq(name))
err := ds.QueryRow(&id)
switch {
case err != nil:
fmt.Println(err.Error())
default:
fmt.Printf("\nFound userId: %+v\n", id)
}
}
findUserIDByName("Bob")
findUserIDByName("Zeb")
}
Output: Found userId: 1 sql: no rows in result set
func (*SelectDataset) QueryRowPartialCtx ¶
func (sd *SelectDataset) QueryRowPartialCtx(ctx context.Context, v any) error
Generates the SELECT sql for this dataset and uses Exec#QueryRowContext to scan the result into a slice of structs
QueryRowContext will only select the columns that can be scanned in to the struct unless you have explicitly selected certain columns. See examples.
i: A pointer to a structs
func (*SelectDataset) QueryRows ¶
func (sd *SelectDataset) QueryRows(v any) error
Generates the SELECT sql for this dataset and uses Exec#QueryRows to scan the results into a slice of structs.
QueryRows will only select the columns that can be scanned in to the struct unless you have explicitly selected certain columns. See examples.
i: A pointer to a slice of structs
Example ¶
package main
import (
"fmt"
"os"
"time"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var (
dropUserRoleTable = `
DROP TABLE IF EXISTS user_role;
`
dropBuilderUserTable = `
DROP TABLE IF EXISTS builder_user;
`
createBuilderUserTable = `
CREATE TABLE builder_user (
id bigint AUTO_INCREMENT,
first_name varchar(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
createUserRoleTable = `
CREATE TABLE user_role (
id bigint AUTO_INCREMENT,
user_id bigint DEFAULT 0,
name varchar(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
tables = []string{dropUserRoleTable, dropBuilderUserTable, createBuilderUserTable, createUserRoleTable}
)
const defaultDBURI = "tommy:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true"
var builderDB *builder.Database
func getDB() *builder.Database {
if builderDB == nil {
dbURI := os.Getenv("MY_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
conn := sqlx.NewSqlConn("mysql", dbURI)
builderDB = builder.New("mysql", conn)
}
for _, table := range tables {
if _, err := builderDB.Exec(table); err != nil {
panic(err)
}
}
type builderUser struct {
ID int64 `db:"id" builder:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
type userRole struct {
ID int64 `db:"id" builder:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
users := []builderUser{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
roles := []userRole{
{Name: "Admin"},
{Name: "Manager"},
{Name: "Manager"},
{Name: "User"},
}
for index, user := range users {
ret, err := builderDB.Insert("builder_user").Rows(user).Exec()
if err != nil {
panic(err)
}
roles[index].UserID, err = ret.LastInsertId()
if err != nil {
panic(err)
}
}
_, err := builderDB.Insert("user_role").Rows(roles).Exec()
if err != nil {
panic(err)
}
return builderDB
}
func main() {
type User struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
db := getDB()
var users []User
if err := db.From("builder_user").QueryRows(&users); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("\n%+v", users)
users = users[0:0]
if err := db.From("builder_user").Select("first_name").QueryRowsPartial(&users); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("\n%+v", users)
}
Output: [{FirstName:Bob LastName:Yukon} {FirstName:Sally LastName:Yukon} {FirstName:Vinita LastName:Yukon} {FirstName:John LastName:Doe}] [{FirstName:Bob LastName:} {FirstName:Sally LastName:} {FirstName:Vinita LastName:} {FirstName:John LastName:}]
Example (Prepared) ¶
package main
import (
"fmt"
"os"
"time"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var (
dropUserRoleTable = `
DROP TABLE IF EXISTS user_role;
`
dropBuilderUserTable = `
DROP TABLE IF EXISTS builder_user;
`
createBuilderUserTable = `
CREATE TABLE builder_user (
id bigint AUTO_INCREMENT,
first_name varchar(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
createUserRoleTable = `
CREATE TABLE user_role (
id bigint AUTO_INCREMENT,
user_id bigint DEFAULT 0,
name varchar(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
tables = []string{dropUserRoleTable, dropBuilderUserTable, createBuilderUserTable, createUserRoleTable}
)
const defaultDBURI = "tommy:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true"
var builderDB *builder.Database
func getDB() *builder.Database {
if builderDB == nil {
dbURI := os.Getenv("MY_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
conn := sqlx.NewSqlConn("mysql", dbURI)
builderDB = builder.New("mysql", conn)
}
for _, table := range tables {
if _, err := builderDB.Exec(table); err != nil {
panic(err)
}
}
type builderUser struct {
ID int64 `db:"id" builder:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
type userRole struct {
ID int64 `db:"id" builder:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
users := []builderUser{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
roles := []userRole{
{Name: "Admin"},
{Name: "Manager"},
{Name: "Manager"},
{Name: "User"},
}
for index, user := range users {
ret, err := builderDB.Insert("builder_user").Rows(user).Exec()
if err != nil {
panic(err)
}
roles[index].UserID, err = ret.LastInsertId()
if err != nil {
panic(err)
}
}
_, err := builderDB.Insert("user_role").Rows(roles).Exec()
if err != nil {
panic(err)
}
return builderDB
}
func main() {
type User struct {
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
db := getDB()
ds := db.From("builder_user").
Prepared(true).
Where(builder.Ex{
"last_name": "Yukon",
})
var users []User
if err := ds.QueryRows(&users); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("\n%+v", users)
}
Output: [{FirstName:Bob LastName:Yukon} {FirstName:Sally LastName:Yukon} {FirstName:Vinita LastName:Yukon}]
Example (WithJoinAutoSelect) ¶
In this example we create a new struct that has two structs that represent two table the User and Role fields are tagged with the table name
package main
import (
"fmt"
"os"
"time"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var (
dropUserRoleTable = `
DROP TABLE IF EXISTS user_role;
`
dropBuilderUserTable = `
DROP TABLE IF EXISTS builder_user;
`
createBuilderUserTable = `
CREATE TABLE builder_user (
id bigint AUTO_INCREMENT,
first_name varchar(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
createUserRoleTable = `
CREATE TABLE user_role (
id bigint AUTO_INCREMENT,
user_id bigint DEFAULT 0,
name varchar(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
tables = []string{dropUserRoleTable, dropBuilderUserTable, createBuilderUserTable, createUserRoleTable}
)
const defaultDBURI = "tommy:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true"
var builderDB *builder.Database
func getDB() *builder.Database {
if builderDB == nil {
dbURI := os.Getenv("MY_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
conn := sqlx.NewSqlConn("mysql", dbURI)
builderDB = builder.New("mysql", conn)
}
for _, table := range tables {
if _, err := builderDB.Exec(table); err != nil {
panic(err)
}
}
type builderUser struct {
ID int64 `db:"id" builder:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
type userRole struct {
ID int64 `db:"id" builder:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
users := []builderUser{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
roles := []userRole{
{Name: "Admin"},
{Name: "Manager"},
{Name: "Manager"},
{Name: "User"},
}
for index, user := range users {
ret, err := builderDB.Insert("builder_user").Rows(user).Exec()
if err != nil {
panic(err)
}
roles[index].UserID, err = ret.LastInsertId()
if err != nil {
panic(err)
}
}
_, err := builderDB.Insert("user_role").Rows(roles).Exec()
if err != nil {
panic(err)
}
return builderDB
}
func main() {
type Role struct {
UserID uint64 `db:"user_id"`
Name string `db:"name"`
}
type User struct {
ID uint64 `db:"id"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
}
type UserAndRole struct {
User // tag as the "builder_user" table
Role // tag as "user_role" table
}
db := getDB()
ds := db.
From("builder_user").
Join(builder.T("user_role"), builder.On(builder.I("builder_user.id").Eq(builder.I("user_role.user_id"))))
var users []UserAndRole
// query rows will auto build the
err := ds.QueryRows(&users)
if err != nil {
fmt.Println(err.Error())
return
}
for _, u := range users {
fmt.Printf("\n%+v", u)
}
}
Output: {User:{ID:1 FirstName:Bob LastName:Yukon} Role:{UserID:1 Name:Admin}} {User:{ID:2 FirstName:Sally LastName:Yukon} Role:{UserID:2 Name:Manager}} {User:{ID:3 FirstName:Vinita LastName:Yukon} Role:{UserID:3 Name:Manager}} {User:{ID:4 FirstName:John LastName:Doe} Role:{UserID:4 Name:User}}
func (*SelectDataset) QueryRowsCtx ¶
func (sd *SelectDataset) QueryRowsCtx(ctx context.Context, v any) error
Generates the SELECT sql for this dataset and uses Exec#QueryRowsContext to scan the results into a slice of structs.
QueryRowsContext will only select the columns that can be scanned in to the struct unless you have explicitly selected certain columns. See examples.
i: A pointer to a slice of structs
func (*SelectDataset) QueryRowsPartial ¶
func (sd *SelectDataset) QueryRowsPartial(v any) error
Generates the SELECT sql for this dataset and uses Exec#QueryRows to scan the results into a slice of structs.
QueryRows will only select the columns that can be scanned in to the struct unless you have explicitly selected certain columns. See examples.
i: A pointer to a slice of structs
Example ¶
package main
import (
"fmt"
"os"
"time"
"github.com/Tooooommy/builder/v9"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var (
dropUserRoleTable = `
DROP TABLE IF EXISTS user_role;
`
dropBuilderUserTable = `
DROP TABLE IF EXISTS builder_user;
`
createBuilderUserTable = `
CREATE TABLE builder_user (
id bigint AUTO_INCREMENT,
first_name varchar(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
createUserRoleTable = `
CREATE TABLE user_role (
id bigint AUTO_INCREMENT,
user_id bigint DEFAULT 0,
name varchar(45) NOT NULL,
created timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB COLLATE utf8mb4_general_ci;
`
tables = []string{dropUserRoleTable, dropBuilderUserTable, createBuilderUserTable, createUserRoleTable}
)
const defaultDBURI = "tommy:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true"
var builderDB *builder.Database
func getDB() *builder.Database {
if builderDB == nil {
dbURI := os.Getenv("MY_URI")
if dbURI == "" {
dbURI = defaultDBURI
}
conn := sqlx.NewSqlConn("mysql", dbURI)
builderDB = builder.New("mysql", conn)
}
for _, table := range tables {
if _, err := builderDB.Exec(table); err != nil {
panic(err)
}
}
type builderUser struct {
ID int64 `db:"id" builder:"skipinsert"`
FirstName string `db:"first_name"`
LastName string `db:"last_name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
type userRole struct {
ID int64 `db:"id" builder:"skipinsert"`
UserID int64 `db:"user_id"`
Name string `db:"name"`
Created time.Time `db:"created" builder:"skipupdate,skipinsert"`
}
users := []builderUser{
{FirstName: "Bob", LastName: "Yukon"},
{FirstName: "Sally", LastName: "Yukon"},
{FirstName: "Vinita", LastName: "Yukon"},
{FirstName: "John", LastName: "Doe"},
}
roles := []userRole{
{Name: "Admin"},
{Name: "Manager"},
{Name: "Manager"},
{Name: "User"},
}
for index, user := range users {
ret, err := builderDB.Insert("builder_user").Rows(user).Exec()
if err != nil {
panic(err)
}
roles[index].UserID, err = ret.LastInsertId()
if err != nil {
panic(err)
}
}
_, err := builderDB.Insert("user_role").Rows(roles).Exec()
if err != nil {
panic(err)
}
return builderDB
}
func main() {
var ids []int64
if err := getDB().From("builder_user").Select("id").QueryRows(&ids); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("UserIds = %+v", ids)
}
Output: UserIds = [1 2 3 4]
func (*SelectDataset) QueryRowsPartialCtx ¶
func (sd *SelectDataset) QueryRowsPartialCtx(ctx context.Context, v any) error
Generates the SELECT sql for this dataset and uses Exec#QueryRowsContext to scan the results into a slice of structs.
QueryRowsContext will only select the columns that can be scanned in to the struct unless you have explicitly selected certain columns. See examples.
i: A pointer to a slice of structs
func (*SelectDataset) ReturnsColumns ¶
func (sd *SelectDataset) ReturnsColumns() bool
func (*SelectDataset) RightJoin ¶
func (sd *SelectDataset) RightJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
Adds a RIGHT JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").RightJoin(
builder.T("test2"),
builder.On(builder.Ex{
"test.fkey": builder.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").RightJoin(
builder.T("test2"),
builder.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").RightJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
builder.On(builder.I("test.fkey").Eq(builder.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").RightJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
builder.On(builder.I("test.fkey").Eq(builder.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" RIGHT JOIN "test2" ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" RIGHT JOIN "test2" USING ("common_column") SELECT * FROM "test" RIGHT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" RIGHT JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
func (*SelectDataset) RightOuterJoin ¶
func (sd *SelectDataset) RightOuterJoin(table exp.Expression, condition exp.JoinCondition) *SelectDataset
Adds a RIGHT OUTER JOIN clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").RightOuterJoin(
builder.T("test2"),
builder.On(builder.Ex{
"test.fkey": builder.I("test2.Id"),
}),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").RightOuterJoin(
builder.T("test2"),
builder.Using("common_column"),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").RightOuterJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)),
builder.On(builder.I("test.fkey").Eq(builder.I("test2.Id"))),
).ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").RightOuterJoin(
builder.From("test2").Where(builder.C("amount").Gt(0)).As("t"),
builder.On(builder.I("test.fkey").Eq(builder.I("t.Id"))),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" RIGHT OUTER JOIN "test2" ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" RIGHT OUTER JOIN "test2" USING ("common_column") SELECT * FROM "test" RIGHT OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) ON ("test"."fkey" = "test2"."Id") SELECT * FROM "test" RIGHT OUTER JOIN (SELECT * FROM "test2" WHERE ("amount" > 0)) AS "t" ON ("test"."fkey" = "t"."Id")
func (*SelectDataset) Select ¶
func (sd *SelectDataset) Select(selects ...any) *SelectDataset
Adds columns to the SELECT clause. See examples You can pass in the following.
string: Will automatically be turned into an identifier Dataset: Will use the SQL generated from that Dataset. If the dataset is aliased it will use that alias as the column name. LiteralExpression: (See Literal) Will use the literal SQL SQLFunction: (See Func, MIN, MAX, COUNT....) Struct: If passing in an instance of a struct, we will parse the struct for the column names to select. See examples
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select("a", "b", "c").ToSQL()
fmt.Println(sql)
}
Output: SELECT "a", "b", "c" FROM "test"
Example (WithAliasedDataset) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test")
fromDs := ds.Select("age").Where(builder.C("age").Gt(10))
sql, _, _ := ds.From().Select(fromDs.As("ages")).ToSQL()
fmt.Println(sql)
}
Output: SELECT (SELECT "age" FROM "test" WHERE ("age" > 10)) AS "ages"
Example (WithDataset) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test")
fromDs := ds.Select("age").Where(builder.C("age").Gt(10))
sql, _, _ := ds.From().Select(fromDs).ToSQL()
fmt.Println(sql)
}
Output: SELECT (SELECT "age" FROM "test" WHERE ("age" > 10))
Example (WithLiteral) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(builder.L("a + b").As("sum")).ToSQL()
fmt.Println(sql)
}
Output: SELECT a + b AS "sum" FROM "test"
Example (WithSQLFunctionExpression) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").Select(
builder.COUNT("*").As("age_count"),
builder.MAX("age").As("max_age"),
builder.AVG("age").As("avg_age"),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT COUNT(*) AS "age_count", MAX("age") AS "max_age", AVG("age") AS "avg_age" FROM "test"
Example (WithStruct) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test")
type myStruct struct {
Name string
Address string `db:"address"`
EmailAddress string `db:"email_address"`
}
// Pass with pointer
sql, _, _ := ds.Select(&myStruct{}).ToSQL()
fmt.Println(sql)
// Pass instance of
sql, _, _ = ds.Select(myStruct{}).ToSQL()
fmt.Println(sql)
type myStruct2 struct {
myStruct
Zipcode string `db:"zipcode"`
}
// Pass pointer to struct with embedded struct
sql, _, _ = ds.Select(&myStruct2{}).ToSQL()
fmt.Println(sql)
// Pass instance of struct with embedded struct
sql, _, _ = ds.Select(myStruct2{}).ToSQL()
fmt.Println(sql)
var myStructs []myStruct
// Pass slice of structs, will only select columns from underlying type
sql, _, _ = ds.Select(myStructs).ToSQL()
fmt.Println(sql)
}
Output: SELECT "address", "email_address", "name" FROM "test" SELECT "address", "email_address", "name" FROM "test" SELECT "address", "email_address", "name", "zipcode" FROM "test" SELECT "address", "email_address", "name", "zipcode" FROM "test" SELECT "address", "email_address", "name" FROM "test"
func (*SelectDataset) SelectAppend ¶
func (sd *SelectDataset) SelectAppend(selects ...any) *SelectDataset
Adds columns to the SELECT clause. See examples You can pass in the following.
string: Will automatically be turned into an identifier Dataset: Will use the SQL generated from that Dataset. If the dataset is aliased it will use that alias as the column name. LiteralExpression: (See Literal) Will use the literal SQL SQLFunction: (See Func, MIN, MAX, COUNT....)
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").Select("a", "b")
sql, _, _ := ds.SelectAppend("c").ToSQL()
fmt.Println(sql)
ds = builder.From("test").Select("a", "b").Distinct()
sql, _, _ = ds.SelectAppend("c").ToSQL()
fmt.Println(sql)
}
Output: SELECT "a", "b", "c" FROM "test" SELECT DISTINCT "a", "b", "c" FROM "test"
func (*SelectDataset) SelectDistinct
deprecated
func (sd *SelectDataset) SelectDistinct(selects ...any) *SelectDataset
Adds columns to the SELECT DISTINCT clause. See examples You can pass in the following.
string: Will automatically be turned into an identifier Dataset: Will use the SQL generated from that Dataset. If the dataset is aliased it will use that alias as the column name. LiteralExpression: (See Literal) Will use the literal SQL SQLFunction: (See Func, MIN, MAX, COUNT....) Struct: If passing in an instance of a struct, we will parse the struct for the column names to select. See examples
Deprecated: Use Distinct() instead.
func (*SelectDataset) SetDialect ¶
func (sd *SelectDataset) SetDialect(dialect SQLDialect) *SelectDataset
Returns the current adapter on the dataset
func (*SelectDataset) SetError ¶
func (sd *SelectDataset) SetError(err error) *SelectDataset
Set an error on the dataset if one has not already been set. This error will be returned by a future call to Error or as part of ToSQL. This can be used by end users to record errors while building up queries without having to track those separately.
func (*SelectDataset) ToSQL ¶
func (sd *SelectDataset) ToSQL() (sql string, params []any, err error)
Generates a SELECT sql statement, if Prepared has been called with true then the parameters will not be interpolated. See examples.
Errors:
- There is an error generating the SQL
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("items").Where(builder.Ex{"a": 1}).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "items" WHERE ("a" = 1) []
Example (Prepared) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("items").Where(builder.Ex{"a": 1}).Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "items" WHERE ("a" = ?) [1]
func (*SelectDataset) Truncate ¶
func (sd *SelectDataset) Truncate() *TruncateDataset
Creates a new TruncateDataset using the FROM of this dataset.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, args, _ := builder.From("items").Truncate().ToSQL()
fmt.Println(sql, args)
}
Output: TRUNCATE "items" []
func (*SelectDataset) Union ¶
func (sd *SelectDataset) Union(other *SelectDataset) *SelectDataset
Creates an UNION statement with another dataset. If this or the other dataset has a limit or offset it will use that dataset as a subselect in the FROM clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").
Union(builder.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").
Limit(1).
Union(builder.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").
Limit(1).
Union(builder.From("test2").
Order(builder.C("id").Desc())).
ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" UNION (SELECT * FROM "test2") SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" UNION (SELECT * FROM "test2") SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" UNION (SELECT * FROM (SELECT * FROM "test2" ORDER BY "id" DESC) AS "t1")
func (*SelectDataset) UnionAll ¶
func (sd *SelectDataset) UnionAll(other *SelectDataset) *SelectDataset
Creates an UNION ALL statement with another dataset. If this or the other dataset has a limit or offset it will use that dataset as a subselect in the FROM clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("test").
UnionAll(builder.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").
Limit(1).
UnionAll(builder.From("test2")).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("test").
Limit(1).
UnionAll(builder.From("test2").
Order(builder.C("id").Desc())).
ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" UNION ALL (SELECT * FROM "test2") SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" UNION ALL (SELECT * FROM "test2") SELECT * FROM (SELECT * FROM "test" LIMIT 1) AS "t1" UNION ALL (SELECT * FROM (SELECT * FROM "test2" ORDER BY "id" DESC) AS "t1")
func (*SelectDataset) Update ¶
func (sd *SelectDataset) Update() *UpdateDataset
Creates a new UpdateDataset using the FROM of this dataset. This method will also copy over the `WITH`, `WHERE`, `ORDER , and `LIMIT`
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
type item struct {
Address string `db:"address"`
Name string `db:"name"`
}
sql, args, _ := builder.From("items").Update().Set(
item{Name: "Test", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("items").Update().Set(
builder.Record{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("items").Update().Set(
map[string]any{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] UPDATE "items" SET "address"='111 Test Addr',"name"='Test' []
func (*SelectDataset) Where ¶
func (sd *SelectDataset) Where(expressions ...exp.Expression) *SelectDataset
Adds a WHERE clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// By default everything is anded together
sql, _, _ := builder.From("test").Where(builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql)
// You can use ExOr to get ORed expressions together
sql, _, _ = builder.From("test").Where(builder.ExOr{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql)
// You can use Or with Ex to Or multiple Ex maps together
sql, _, _ = builder.From("test").Where(
builder.Or(
builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
},
builder.Ex{
"c": nil,
"d": []string{"a", "b", "c"},
},
),
).ToSQL()
fmt.Println(sql)
// By default everything is anded together
sql, _, _ = builder.From("test").Where(
builder.C("a").Gt(10),
builder.C("b").Lt(10),
builder.C("c").IsNull(),
builder.C("d").In("a", "b", "c"),
).ToSQL()
fmt.Println(sql)
// You can use a combination of Ors and Ands
sql, _, _ = builder.From("test").Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Lt(10),
builder.C("c").IsNull(),
),
),
).ToSQL()
fmt.Println(sql)
}
Output: SELECT * FROM "test" WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c'))) SELECT * FROM "test" WHERE (("a" > 10) OR ("b" < 10) OR ("c" IS NULL) OR ("d" IN ('a', 'b', 'c'))) SELECT * FROM "test" WHERE ((("a" > 10) AND ("b" < 10)) OR (("c" IS NULL) AND ("d" IN ('a', 'b', 'c')))) SELECT * FROM "test" WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c'))) SELECT * FROM "test" WHERE (("a" > 10) OR (("b" < 10) AND ("c" IS NULL)))
Example (Prepared) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
// By default everything is anded together
sql, args, _ := builder.From("test").Prepared(true).Where(builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql, args)
// You can use ExOr to get ORed expressions together
sql, args, _ = builder.From("test").Prepared(true).Where(builder.ExOr{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql, args)
// You can use Or with Ex to Or multiple Ex maps together
sql, args, _ = builder.From("test").Prepared(true).Where(
builder.Or(
builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
},
builder.Ex{
"c": nil,
"d": []string{"a", "b", "c"},
},
),
).ToSQL()
fmt.Println(sql, args)
// By default everything is anded together
sql, args, _ = builder.From("test").Prepared(true).Where(
builder.C("a").Gt(10),
builder.C("b").Lt(10),
builder.C("c").IsNull(),
builder.C("d").In("a", "b", "c"),
).ToSQL()
fmt.Println(sql, args)
// You can use a combination of Ors and Ands
sql, args, _ = builder.From("test").Prepared(true).Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Lt(10),
builder.C("c").IsNull(),
),
),
).ToSQL()
fmt.Println(sql, args)
}
Output: SELECT * FROM "test" WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [10 10 a b c] SELECT * FROM "test" WHERE (("a" > ?) OR ("b" < ?) OR ("c" IS NULL) OR ("d" IN (?, ?, ?))) [10 10 a b c] SELECT * FROM "test" WHERE ((("a" > ?) AND ("b" < ?)) OR (("c" IS NULL) AND ("d" IN (?, ?, ?)))) [10 10 a b c] SELECT * FROM "test" WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [10 10 a b c] SELECT * FROM "test" WHERE (("a" > ?) OR (("b" < ?) AND ("c" IS NULL))) [10 10]
func (*SelectDataset) Window ¶
func (sd *SelectDataset) Window(ws ...exp.WindowExpression) *SelectDataset
Sets the WINDOW clauses
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.From("test").
Select(builder.ROW_NUMBER().Over(builder.W().PartitionBy("a").OrderBy(builder.I("b").Asc())))
query, args, _ := ds.ToSQL()
fmt.Println(query, args)
ds = builder.From("test").
Select(builder.ROW_NUMBER().OverName(builder.I("w"))).
Window(builder.W("w").PartitionBy("a").OrderBy(builder.I("b").Asc()))
query, args, _ = ds.ToSQL()
fmt.Println(query, args)
ds = builder.From("test").
Select(builder.ROW_NUMBER().OverName(builder.I("w1"))).
Window(
builder.W("w1").PartitionBy("a"),
builder.W("w").Inherit("w1").OrderBy(builder.I("b").Asc()),
)
query, args, _ = ds.ToSQL()
fmt.Println(query, args)
ds = builder.From("test").
Select(builder.ROW_NUMBER().Over(builder.W().Inherit("w").OrderBy("b"))).
Window(builder.W("w").PartitionBy("a"))
query, args, _ = ds.ToSQL()
fmt.Println(query, args)
// Output
// SELECT ROW_NUMBER() OVER (PARTITION BY "a" ORDER BY "b" ASC) FROM "test" []
// SELECT ROW_NUMBER() OVER "w" FROM "test" WINDOW "w" AS (PARTITION BY "a" ORDER BY "b" ASC) []
// SELECT ROW_NUMBER() OVER "w" FROM "test" WINDOW "w1" AS (PARTITION BY "a"), "w" AS ("w1" ORDER BY "b" ASC) []
// SELECT ROW_NUMBER() OVER ("w" ORDER BY "b") FROM "test" WINDOW "w" AS (PARTITION BY "a") []
}
Output:
func (*SelectDataset) WindowAppend ¶
func (sd *SelectDataset) WindowAppend(ws ...exp.WindowExpression) *SelectDataset
Sets the WINDOW clauses
func (*SelectDataset) With ¶
func (sd *SelectDataset) With(name string, subquery exp.Expression) *SelectDataset
Creates a WITH clause for a common table expression (CTE).
The name will be available to SELECT from in the associated query; and can optionally contain a list of column names "name(col1, col2, col3)".
The name will refer to the results of the specified subquery.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("one").
With("one", builder.From().Select(builder.L("1"))).
Select(builder.Star()).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("derived").
With("intermed", builder.From("test").Select(builder.Star()).Where(builder.C("x").Gte(5))).
With("derived", builder.From("intermed").Select(builder.Star()).Where(builder.C("x").Lt(10))).
Select(builder.Star()).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.From("multi").
With("multi(x,y)", builder.From().Select(builder.L("1"), builder.L("2"))).
Select(builder.C("x"), builder.C("y")).
ToSQL()
fmt.Println(sql)
}
Output: WITH one AS (SELECT 1) SELECT * FROM "one" WITH intermed AS (SELECT * FROM "test" WHERE ("x" >= 5)), derived AS (SELECT * FROM "intermed" WHERE ("x" < 10)) SELECT * FROM "derived" WITH multi(x,y) AS (SELECT 1, 2) SELECT "x", "y" FROM "multi"
Example (DeleteDataset) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
deleteDs := builder.Delete("foo").Where(builder.Ex{"bar": "baz"}).Returning("id")
ds := builder.From("bar").
With("del", deleteDs).
Select("bar_name").
Where(builder.Ex{"bar.user_id": builder.I("del.user_id")})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
sql, args, _ := ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: WITH del AS (DELETE FROM "foo" WHERE ("bar" = 'baz') RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "del"."user_id") WITH del AS (DELETE FROM "foo" WHERE ("bar" = ?) RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "del"."user_id") [baz]
Example (InsertDataset) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
insertDs := builder.Insert("foo").Rows(builder.Record{"user_id": 10}).Returning("id")
ds := builder.From("bar").
With("ins", insertDs).
Select("bar_name").
Where(builder.Ex{"bar.user_id": builder.I("ins.user_id")})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
sql, args, _ := ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: WITH ins AS (INSERT INTO "foo" ("user_id") VALUES (10) RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "ins"."user_id") WITH ins AS (INSERT INTO "foo" ("user_id") VALUES (?) RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "ins"."user_id") [10]
Example (UpdateDataset) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
updateDs := builder.Update("foo").Set(builder.Record{"bar": "baz"}).Returning("id")
ds := builder.From("bar").
With("upd", updateDs).
Select("bar_name").
Where(builder.Ex{"bar.user_id": builder.I("upd.user_id")})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
sql, args, _ := ds.Prepared(true).ToSQL()
fmt.Println(sql, args)
}
Output: WITH upd AS (UPDATE "foo" SET "bar"='baz' RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "upd"."user_id") WITH upd AS (UPDATE "foo" SET "bar"=? RETURNING "id") SELECT "bar_name" FROM "bar" WHERE ("bar"."user_id" = "upd"."user_id") [baz]
func (*SelectDataset) WithDialect ¶
func (sd *SelectDataset) WithDialect(dl string) *SelectDataset
Sets the adapter used to serialize values and create the SQL statement
func (*SelectDataset) WithRecursive ¶
func (sd *SelectDataset) WithRecursive(name string, subquery exp.Expression) *SelectDataset
Creates a WITH RECURSIVE clause for a common table expression (CTE)
The name will be available to SELECT from in the associated query; and must contain a list of column names "name(col1, col2, col3)" for a recursive clause.
The name will refer to the results of the specified subquery. The subquery for a recursive query will always end with a UNION or UNION ALL with a clause that refers to the CTE by name.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
sql, _, _ := builder.From("nums").
WithRecursive("nums(x)",
builder.From().Select(builder.L("1")).
UnionAll(builder.From("nums").
Select(builder.L("x+1")).Where(builder.C("x").Lt(5)))).
ToSQL()
fmt.Println(sql)
}
Output: WITH RECURSIVE nums(x) AS (SELECT 1 UNION ALL (SELECT x+1 FROM "nums" WHERE ("x" < 5))) SELECT * FROM "nums"
type TruncateDataset ¶
type TruncateDataset struct {
// contains filtered or unexported fields
}
func Truncate ¶
func Truncate(table ...any) *TruncateDataset
func (*TruncateDataset) Cascade ¶
func (td *TruncateDataset) Cascade() *TruncateDataset
Adds a CASCADE clause
func (*TruncateDataset) Clone ¶
func (td *TruncateDataset) Clone() exp.Expression
Clones the dataset
func (*TruncateDataset) Dialect ¶
func (td *TruncateDataset) Dialect() SQLDialect
Returns the current adapter on the dataset
func (*TruncateDataset) Error ¶
func (td *TruncateDataset) Error() error
Get any error that has been set or nil if no error has been set.
func (*TruncateDataset) Expression ¶
func (td *TruncateDataset) Expression() exp.Expression
func (*TruncateDataset) GetClauses ¶
func (td *TruncateDataset) GetClauses() exp.TruncateClauses
Returns the current clauses on the dataset.
func (*TruncateDataset) Identity ¶
func (td *TruncateDataset) Identity(identity string) *TruncateDataset
Add a IDENTITY clause (e.g. RESTART)
func (*TruncateDataset) IsPrepared ¶
func (td *TruncateDataset) IsPrepared() bool
func (*TruncateDataset) NoCascade ¶
func (td *TruncateDataset) NoCascade() *TruncateDataset
Clears the CASCADE clause
func (*TruncateDataset) NoRestrict ¶
func (td *TruncateDataset) NoRestrict() *TruncateDataset
Clears the RESTRICT clause
func (*TruncateDataset) Prepared ¶
func (td *TruncateDataset) Prepared(prepared bool) *TruncateDataset
Set the parameter interpolation behavior. See examples
prepared: If true the dataset WILL NOT interpolate the parameters.
func (*TruncateDataset) Restrict ¶
func (td *TruncateDataset) Restrict() *TruncateDataset
Adds a RESTRICT clause
func (*TruncateDataset) SetDialect ¶
func (td *TruncateDataset) SetDialect(dialect SQLDialect) *TruncateDataset
Returns the current adapter on the dataset
func (*TruncateDataset) SetError ¶
func (td *TruncateDataset) SetError(err error) *TruncateDataset
Set an error on the dataset if one has not already been set. This error will be returned by a future call to Error or as part of ToSQL. This can be used by end users to record errors while building up queries without having to track those separately.
func (*TruncateDataset) Table ¶
func (td *TruncateDataset) Table(table ...any) *TruncateDataset
Adds a FROM clause. This return a new dataset with the original sources replaced. See examples. You can pass in the following.
string: Will automatically be turned into an identifier IdentifierExpression LiteralExpression: (See Literal) Will use the literal SQL
func (*TruncateDataset) ToSQL ¶
func (td *TruncateDataset) ToSQL() (sql string, params []any, err error)
Generates a TRUNCATE sql statement, if Prepared has been called with true then the parameters will not be interpolated. See examples.
Errors:
- There is an error generating the SQL
func (*TruncateDataset) TruncateCtx ¶
func (*TruncateDataset) WithDialect ¶
func (td *TruncateDataset) WithDialect(dl string) *TruncateDataset
Sets the adapter used to serialize values and create the SQL statement
type TruncateOptions ¶
type TruncateOptions = exp.TruncateOptions
Options to use when generating a TRUNCATE statement
type TxDatabase ¶
type TxDatabase struct {
// contains filtered or unexported fields
}
A wrapper around a sql.Tx and works the same way as Database
func (*TxDatabase) Delete ¶
func (td *TxDatabase) Delete(table any) *DeleteDataset
func (*TxDatabase) From ¶
func (td *TxDatabase) From(cols ...any) *SelectDataset
Creates a new Dataset for querying a Database.
func (*TxDatabase) Insert ¶
func (td *TxDatabase) Insert(table any) *InsertDataset
func (*TxDatabase) Prepare ¶
func (td *TxDatabase) Prepare(query string) (sqlx.StmtSession, error)
See Database#Prepare
func (*TxDatabase) PrepareCtx ¶
func (td *TxDatabase) PrepareCtx(ctx context.Context, query string) (sqlx.StmtSession, error)
See Database#PrepareContext
func (*TxDatabase) QueryRow ¶
func (td *TxDatabase) QueryRow(v any, query string, args ...any) error
See Database#Query
func (*TxDatabase) QueryRowCtx ¶
See Database#QueryContext
func (*TxDatabase) QueryRowPartial ¶
func (td *TxDatabase) QueryRowPartial(v any, query string, args ...any) error
See Database#Query
func (*TxDatabase) QueryRowPartialCtx ¶
func (td *TxDatabase) QueryRowPartialCtx(ctx context.Context, v any, query string, args ...any) error
See Database#QueryContext
func (*TxDatabase) QueryRows ¶
func (td *TxDatabase) QueryRows(v any, query string, args ...any) error
See Database#Query
func (*TxDatabase) QueryRowsCtx ¶
See Database#QueryContext
func (*TxDatabase) QueryRowsPartial ¶
func (td *TxDatabase) QueryRowsPartial(v any, query string, args ...any) error
See Database#Query
func (*TxDatabase) QueryRowsPartialCtx ¶
func (td *TxDatabase) QueryRowsPartialCtx(ctx context.Context, v any, query string, args ...any) error
See Database#QueryContext
func (*TxDatabase) Select ¶
func (td *TxDatabase) Select(cols ...any) *SelectDataset
func (*TxDatabase) Trace ¶
func (td *TxDatabase) Trace(ctx context.Context, op, sqlString string, args ...any)
func (*TxDatabase) Truncate ¶
func (td *TxDatabase) Truncate(table ...any) *TruncateDataset
func (*TxDatabase) Update ¶
func (td *TxDatabase) Update(table any) *UpdateDataset
type UpdateDataset ¶
type UpdateDataset struct {
// contains filtered or unexported fields
}
func Update ¶
func Update(table any) *UpdateDataset
Example (WithMap) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, args, _ := builder.Update("items").Set(
map[string]any{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"='Test' []
Example (WithSkipUpdateTag) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type item struct {
Address string `db:"address"`
Name string `db:"name" builder:"skipupdate"`
}
sql, args, _ := builder.Update("items").Set(
item{Name: "Test", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr' []
Example (WithStruct) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type item struct {
Address string `db:"address"`
Name string `db:"name"`
}
sql, args, _ := builder.Update("items").Set(
item{Name: "Test", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"='Test' []
Example (WithbuilderRecord) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, args, _ := builder.Update("items").Set(
builder.Record{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"='Test' []
func (*UpdateDataset) AppendSQL ¶
func (ud *UpdateDataset) AppendSQL(b sb.SQLBuilder)
Appends this Dataset's UPDATE statement to the SQLBuilder This is used internally when using updates in CTEs
func (*UpdateDataset) ClearLimit ¶
func (ud *UpdateDataset) ClearLimit() *UpdateDataset
Removes the LIMIT clause.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Dialect("mysql").
Update("test").
Set(builder.Record{"foo": "bar"}).
Limit(10)
sql, _, _ := ds.ClearLimit().ToSQL()
fmt.Println(sql)
}
Output: UPDATE `test` SET `foo`='bar'
func (*UpdateDataset) ClearOrder ¶
func (ud *UpdateDataset) ClearOrder() *UpdateDataset
Removes the ORDER BY clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Dialect("mysql").
Update("test").
Set(builder.Record{"foo": "bar"}).
Order(builder.C("a").Asc())
sql, _, _ := ds.ClearOrder().ToSQL()
fmt.Println(sql)
}
Output: UPDATE `test` SET `foo`='bar'
func (*UpdateDataset) ClearWhere ¶
func (ud *UpdateDataset) ClearWhere() *UpdateDataset
Removes the WHERE clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.
Update("test").
Set(builder.Record{"foo": "bar"}).
Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Lt(10),
builder.C("c").IsNull(),
),
),
)
sql, _, _ := ds.ClearWhere().ToSQL()
fmt.Println(sql)
}
Output: UPDATE "test" SET "foo"='bar'
func (*UpdateDataset) Dialect ¶
func (ud *UpdateDataset) Dialect() SQLDialect
Returns the current adapter on the dataset
func (*UpdateDataset) Error ¶
func (ud *UpdateDataset) Error() error
Get any error that has been set or nil if no error has been set.
func (*UpdateDataset) Exec ¶
func (ud *UpdateDataset) Exec() (sql.Result, error)
Generates the UPDATE sql, and returns an exec.QueryExecutor with the sql set to the UPDATE statement
db.Update("test").Set(Record{"name":"Bob", update: time.Now()}).Executor()
Example ¶
db := getDB()
_, err := db.Update("builder_user").
Set(builder.Record{"last_name": "ucon"}).
Where(builder.Ex{"last_name": "Yukon"}).Exec()
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Printf("UpdateDatabaset Exec")
}
Output: UpdateDatabaset Exec
func (*UpdateDataset) Expression ¶
func (ud *UpdateDataset) Expression() exp.Expression
func (*UpdateDataset) From ¶
func (ud *UpdateDataset) From(tables ...any) *UpdateDataset
Allows specifying other tables to reference in your update (If your dialect supports it). See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Update("table_one").
Set(builder.Record{"foo": builder.I("table_two.bar")}).
From("table_two").
Where(builder.Ex{"table_one.id": builder.I("table_two.id")})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: UPDATE "table_one" SET "foo"="table_two"."bar" FROM "table_two" WHERE ("table_one"."id" = "table_two"."id")
Example (Mysql) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
dialect := builder.Dialect("mysql")
ds := dialect.Update("table_one").
Set(builder.Record{"foo": builder.I("table_two.bar")}).
From("table_two").
Where(builder.Ex{"table_one.id": builder.I("table_two.id")})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: UPDATE `table_one`,`table_two` SET `foo`=`table_two`.`bar` WHERE (`table_one`.`id` = `table_two`.`id`)
Example (Postgres) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
dialect := builder.Dialect("postgres")
ds := dialect.Update("table_one").
Set(builder.Record{"foo": builder.I("table_two.bar")}).
From("table_two").
Where(builder.Ex{"table_one.id": builder.I("table_two.id")})
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: UPDATE "table_one" SET "foo"="table_two"."bar" FROM "table_two" WHERE ("table_one"."id" = "table_two"."id")
func (*UpdateDataset) GetAs ¶
func (ud *UpdateDataset) GetAs() exp.IdentifierExpression
func (*UpdateDataset) GetClauses ¶
func (ud *UpdateDataset) GetClauses() exp.UpdateClauses
Returns the current clauses on the dataset.
func (*UpdateDataset) IsPrepared ¶
func (ud *UpdateDataset) IsPrepared() bool
func (*UpdateDataset) Limit ¶
func (ud *UpdateDataset) Limit(limit uint) *UpdateDataset
Adds a LIMIT clause. If the LIMIT is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Dialect("mysql").
Update("test").
Set(builder.Record{"foo": "bar"}).
Limit(10)
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: UPDATE `test` SET `foo`='bar' LIMIT 10
func (*UpdateDataset) LimitAll ¶
func (ud *UpdateDataset) LimitAll() *UpdateDataset
Adds a LIMIT ALL clause. If the LIMIT is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Dialect("mysql").
Update("test").
Set(builder.Record{"foo": "bar"}).
LimitAll()
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: UPDATE `test` SET `foo`='bar' LIMIT ALL
func (*UpdateDataset) Order ¶
func (ud *UpdateDataset) Order(order ...exp.OrderedExpression) *UpdateDataset
Adds a ORDER clause. If the ORDER is currently set it replaces it. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Dialect("mysql").
Update("test").
Set(builder.Record{"foo": "bar"}).
Order(builder.C("a").Asc())
sql, _, _ := ds.ToSQL()
fmt.Println(sql)
}
Output: UPDATE `test` SET `foo`='bar' ORDER BY `a` ASC
func (*UpdateDataset) OrderAppend ¶
func (ud *UpdateDataset) OrderAppend(order ...exp.OrderedExpression) *UpdateDataset
Adds a more columns to the current ORDER BY clause. If no order has be previously specified it is the same as calling Order. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Dialect("mysql").
Update("test").
Set(builder.Record{"foo": "bar"}).
Order(builder.C("a").Asc())
sql, _, _ := ds.OrderAppend(builder.C("b").Desc().NullsLast()).ToSQL()
fmt.Println(sql)
}
Output: UPDATE `test` SET `foo`='bar' ORDER BY `a` ASC, `b` DESC NULLS LAST
func (*UpdateDataset) OrderPrepend ¶
func (ud *UpdateDataset) OrderPrepend(order ...exp.OrderedExpression) *UpdateDataset
Adds a more columns to the beginning of the current ORDER BY clause. If no order has be previously specified it is the same as calling Order. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Dialect("mysql").
Update("test").
Set(builder.Record{"foo": "bar"}).
Order(builder.C("a").Asc())
sql, _, _ := ds.OrderPrepend(builder.C("b").Desc().NullsLast()).ToSQL()
fmt.Println(sql)
}
Output: UPDATE `test` SET `foo`='bar' ORDER BY `b` DESC NULLS LAST, `a` ASC
func (*UpdateDataset) Prepared ¶
func (ud *UpdateDataset) Prepared(prepared bool) *UpdateDataset
Set the parameter interpolation behavior. See examples
prepared: If true the dataset WILL NOT interpolate the parameters.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, args, _ := builder.Update("items").Prepared(true).Set(
builder.Record{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"=?,"name"=? [111 Test Addr Test]
func (*UpdateDataset) QueryRow ¶
func (ud *UpdateDataset) QueryRow(v any) error
func (*UpdateDataset) QueryRowCtx ¶
func (ud *UpdateDataset) QueryRowCtx(ctx context.Context, v any) error
func (*UpdateDataset) QueryRowPartial ¶
func (ud *UpdateDataset) QueryRowPartial(v any) error
func (*UpdateDataset) QueryRowPartialCtx ¶
func (ud *UpdateDataset) QueryRowPartialCtx(ctx context.Context, v any) error
func (*UpdateDataset) QueryRows ¶
func (ud *UpdateDataset) QueryRows(v any) error
func (*UpdateDataset) QueryRowsCtx ¶
func (ud *UpdateDataset) QueryRowsCtx(ctx context.Context, v any) error
func (*UpdateDataset) QueryRowsPartial ¶
func (ud *UpdateDataset) QueryRowsPartial(v any) error
func (*UpdateDataset) QueryRowsPartialCtx ¶
func (ud *UpdateDataset) QueryRowsPartialCtx(ctx context.Context, v any) error
func (*UpdateDataset) Returning ¶
func (ud *UpdateDataset) Returning(returning ...any) *UpdateDataset
Adds a RETURNING clause to the dataset if the adapter supports it. See examples.
func (*UpdateDataset) ReturnsColumns ¶
func (ud *UpdateDataset) ReturnsColumns() bool
func (*UpdateDataset) Set ¶
func (ud *UpdateDataset) Set(values any) *UpdateDataset
Sets the values to use in the SET clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type item struct {
Address string `db:"address"`
Name string `db:"name"`
}
sql, args, _ := builder.Update("items").Set(
item{Name: "Test", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.Update("items").Set(
builder.Record{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.Update("items").Set(
map[string]any{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] UPDATE "items" SET "address"='111 Test Addr',"name"='Test' [] UPDATE "items" SET "address"='111 Test Addr',"name"='Test' []
Example (BuilderRecord) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, args, _ := builder.Update("items").Set(
builder.Record{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"='Test' []
Example (Map) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, args, _ := builder.Update("items").Set(
map[string]any{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"='Test' []
Example (Struct) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type item struct {
Address string `db:"address"`
Name string `db:"name"`
}
sql, args, _ := builder.Update("items").Set(
item{Name: "Test", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"='Test' []
Example (WithDefaultIfEmptyTag) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type item struct {
Address string `db:"address"`
Name string `db:"name" builder:"defaultifempty"`
}
sql, args, _ := builder.Update("items").Set(
item{Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.Update("items").Set(
item{Name: "Bob Yukon", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"=DEFAULT [] UPDATE "items" SET "address"='111 Test Addr',"name"='Bob Yukon' []
Example (WithEmbeddedStruct) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type Address struct {
Street string `db:"address_street"`
State string `db:"address_state"`
}
type User struct {
Address
FirstName string
LastName string
}
ds := builder.Update("user").Set(
User{Address: Address{Street: "111 Street", State: "NY"}, FirstName: "Greg", LastName: "Farley"},
)
updateSQL, args, _ := ds.ToSQL()
fmt.Println(updateSQL, args)
}
Output: UPDATE "user" SET "address_state"='NY',"address_street"='111 Street',"firstname"='Greg',"lastname"='Farley' []
Example (WithIgnoredEmbedded) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type Address struct {
Street string
State string
}
type User struct {
Address `db:"-"`
FirstName string
LastName string
}
ds := builder.Update("user").Set(
User{Address: Address{Street: "111 Street", State: "NY"}, FirstName: "Greg", LastName: "Farley"},
)
updateSQL, args, _ := ds.ToSQL()
fmt.Println(updateSQL, args)
}
Output: UPDATE "user" SET "firstname"='Greg',"lastname"='Farley' []
Example (WithNilEmbeddedPointer) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type Address struct {
Street string
State string
}
type User struct {
*Address
FirstName string
LastName string
}
ds := builder.Update("user").Set(
User{FirstName: "Greg", LastName: "Farley"},
)
updateSQL, args, _ := ds.ToSQL()
fmt.Println(updateSQL, args)
}
Output: UPDATE "user" SET "firstname"='Greg',"lastname"='Farley' []
Example (WithNoTags) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type item struct {
Address string
Name string
}
sql, args, _ := builder.Update("items").Set(
item{Name: "Test", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr',"name"='Test' []
Example (WithSkipUpdateTag) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type item struct {
Address string `db:"address"`
Name string `db:"name" builder:"skipupdate"`
}
sql, args, _ := builder.Update("items").Set(
item{Name: "Test", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"='111 Test Addr' []
func (*UpdateDataset) SetDialect ¶
func (ud *UpdateDataset) SetDialect(dialect SQLDialect) *UpdateDataset
Returns the current adapter on the dataset
func (*UpdateDataset) SetError ¶
func (ud *UpdateDataset) SetError(err error) *UpdateDataset
Set an error on the dataset if one has not already been set. This error will be returned by a future call to Error or as part of ToSQL. This can be used by end users to record errors while building up queries without having to track those separately.
func (*UpdateDataset) Table ¶
func (ud *UpdateDataset) Table(table any) *UpdateDataset
Sets the table to update.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Update("test")
sql, _, _ := ds.Table("test2").Set(builder.Record{"foo": "bar"}).ToSQL()
fmt.Println(sql)
}
Output: UPDATE "test2" SET "foo"='bar'
Example (Aliased) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
ds := builder.Update("test")
sql, _, _ := ds.Table(builder.T("test").As("t")).Set(builder.Record{"foo": "bar"}).ToSQL()
fmt.Println(sql)
}
Output: UPDATE "test" AS "t" SET "foo"='bar'
func (*UpdateDataset) ToSQL ¶
func (ud *UpdateDataset) ToSQL() (sql string, params []any, err error)
Generates an UPDATE sql statement, if Prepared has been called with true then the parameters will not be interpolated. See examples.
Errors:
- There is an error generating the SQL
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, _, _ := builder.Update("test").
Set(builder.Record{"foo": "bar"}).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.Update("test").
Set(builder.Record{"foo": "bar"}).
ToSQL()
fmt.Println(sql)
sql, _, _ = builder.Update("test").
Set(builder.Record{"foo": "bar"}).
ToSQL()
fmt.Println(sql)
}
Output: UPDATE "test" SET "foo"='bar' UPDATE "test" SET "foo"='bar' UPDATE "test" SET "foo"='bar'
Example (Prepared) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
type item struct {
Address string `db:"address"`
Name string `db:"name"`
}
sql, args, _ := builder.From("items").Prepared(true).Update().Set(
item{Name: "Test", Address: "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("items").Prepared(true).Update().Set(
builder.Record{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
sql, args, _ = builder.From("items").Prepared(true).Update().Set(
map[string]any{"name": "Test", "address": "111 Test Addr"},
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "items" SET "address"=?,"name"=? [111 Test Addr Test] UPDATE "items" SET "address"=?,"name"=? [111 Test Addr Test] UPDATE "items" SET "address"=?,"name"=? [111 Test Addr Test]
func (*UpdateDataset) Where ¶
func (ud *UpdateDataset) Where(expressions ...exp.Expression) *UpdateDataset
Adds a WHERE clause. See examples.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
// By default everything is anded together
sql, _, _ := builder.Update("test").
Set(builder.Record{"foo": "bar"}).
Where(builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql)
// You can use ExOr to get ORed expressions together
sql, _, _ = builder.Update("test").
Set(builder.Record{"foo": "bar"}).
Where(builder.ExOr{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql)
// You can use Or with Ex to Or multiple Ex maps together
sql, _, _ = builder.Update("test").
Set(builder.Record{"foo": "bar"}).
Where(
builder.Or(
builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
},
builder.Ex{
"c": nil,
"d": []string{"a", "b", "c"},
},
),
).ToSQL()
fmt.Println(sql)
// By default everything is anded together
sql, _, _ = builder.Update("test").
Set(builder.Record{"foo": "bar"}).
Where(
builder.C("a").Gt(10),
builder.C("b").Lt(10),
builder.C("c").IsNull(),
builder.C("d").In("a", "b", "c"),
).ToSQL()
fmt.Println(sql)
// You can use a combination of Ors and Ands
sql, _, _ = builder.Update("test").
Set(builder.Record{"foo": "bar"}).
Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Lt(10),
builder.C("c").IsNull(),
),
),
).ToSQL()
fmt.Println(sql)
}
Output: UPDATE "test" SET "foo"='bar' WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c'))) UPDATE "test" SET "foo"='bar' WHERE (("a" > 10) OR ("b" < 10) OR ("c" IS NULL) OR ("d" IN ('a', 'b', 'c'))) UPDATE "test" SET "foo"='bar' WHERE ((("a" > 10) AND ("b" < 10)) OR (("c" IS NULL) AND ("d" IN ('a', 'b', 'c')))) UPDATE "test" SET "foo"='bar' WHERE (("a" > 10) AND ("b" < 10) AND ("c" IS NULL) AND ("d" IN ('a', 'b', 'c'))) UPDATE "test" SET "foo"='bar' WHERE (("a" > 10) OR (("b" < 10) AND ("c" IS NULL)))
Example (Prepared) ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
// By default everything is anded together
sql, args, _ := builder.Update("test").
Prepared(true).
Set(builder.Record{"foo": "bar"}).
Where(builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql, args)
// You can use ExOr to get ORed expressions together
sql, args, _ = builder.Update("test").Prepared(true).
Set(builder.Record{"foo": "bar"}).
Where(builder.ExOr{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
"c": nil,
"d": []string{"a", "b", "c"},
}).ToSQL()
fmt.Println(sql, args)
// You can use Or with Ex to Or multiple Ex maps together
sql, args, _ = builder.Update("test").Prepared(true).
Set(builder.Record{"foo": "bar"}).
Where(
builder.Or(
builder.Ex{
"a": builder.Op{"gt": 10},
"b": builder.Op{"lt": 10},
},
builder.Ex{
"c": nil,
"d": []string{"a", "b", "c"},
},
),
).ToSQL()
fmt.Println(sql, args)
// By default everything is anded together
sql, args, _ = builder.Update("test").Prepared(true).
Set(builder.Record{"foo": "bar"}).
Where(
builder.C("a").Gt(10),
builder.C("b").Lt(10),
builder.C("c").IsNull(),
builder.C("d").In("a", "b", "c"),
).ToSQL()
fmt.Println(sql, args)
// You can use a combination of Ors and Ands
sql, args, _ = builder.Update("test").Prepared(true).
Set(builder.Record{"foo": "bar"}).
Where(
builder.Or(
builder.C("a").Gt(10),
builder.And(
builder.C("b").Lt(10),
builder.C("c").IsNull(),
),
),
).ToSQL()
fmt.Println(sql, args)
}
Output: UPDATE "test" SET "foo"=? WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [bar 10 10 a b c] UPDATE "test" SET "foo"=? WHERE (("a" > ?) OR ("b" < ?) OR ("c" IS NULL) OR ("d" IN (?, ?, ?))) [bar 10 10 a b c] UPDATE "test" SET "foo"=? WHERE ((("a" > ?) AND ("b" < ?)) OR (("c" IS NULL) AND ("d" IN (?, ?, ?)))) [bar 10 10 a b c] UPDATE "test" SET "foo"=? WHERE (("a" > ?) AND ("b" < ?) AND ("c" IS NULL) AND ("d" IN (?, ?, ?))) [bar 10 10 a b c] UPDATE "test" SET "foo"=? WHERE (("a" > ?) OR (("b" < ?) AND ("c" IS NULL))) [bar 10 10]
func (*UpdateDataset) With ¶
func (ud *UpdateDataset) With(name string, subquery exp.Expression) *UpdateDataset
Creates a WITH clause for a common table expression (CTE).
The name will be available to use in the UPDATE from in the associated query; and can optionally contain a list of column names "name(col1, col2, col3)".
The name will refer to the results of the specified subquery.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, _, _ := builder.Update("test").
With("some_vals(val)", builder.From().Select(builder.L("123"))).
Where(builder.C("val").Eq(builder.From("some_vals").Select("val"))).
Set(builder.Record{"name": "Test"}).ToSQL()
fmt.Println(sql)
}
Output: WITH some_vals(val) AS (SELECT 123) UPDATE "test" SET "name"='Test' WHERE ("val" IN (SELECT "val" FROM "some_vals"))
func (*UpdateDataset) WithDialect ¶
func (ud *UpdateDataset) WithDialect(dl string) *UpdateDataset
Sets the adapter used to serialize values and create the SQL statement
func (*UpdateDataset) WithRecursive ¶
func (ud *UpdateDataset) WithRecursive(name string, subquery exp.Expression) *UpdateDataset
Creates a WITH RECURSIVE clause for a common table expression (CTE)
The name will be available to use in the UPDATE from in the associated query; and must contain a list of column names "name(col1, col2, col3)" for a recursive clause.
The name will refer to the results of the specified subquery. The subquery for a recursive query will always end with a UNION or UNION ALL with a clause that refers to the CTE by name.
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
_ "github.com/Tooooommy/builder/v9/dialect/mysql"
)
func main() {
sql, _, _ := builder.Update("nums").
WithRecursive("nums(x)", builder.From().Select(builder.L("1").As("num")).
UnionAll(builder.From("nums").
Select(builder.L("x+1").As("num")).Where(builder.C("x").Lt(5)))).
Set(builder.Record{"foo": builder.T("nums").Col("num")}).
ToSQL()
fmt.Println(sql)
}
Output: WITH RECURSIVE nums(x) AS (SELECT 1 AS "num" UNION ALL (SELECT x+1 AS "num" FROM "nums" WHERE ("x" < 5))) UPDATE "nums" SET "foo"="nums"."num"
type Vals ¶
Example ¶
package main
import (
"fmt"
"github.com/Tooooommy/builder/v9"
)
func main() {
ds := builder.Insert("user").
Cols("first_name", "last_name", "is_verified").
Vals(
builder.Vals{"Greg", "Farley", true},
builder.Vals{"Jimmy", "Stewart", true},
builder.Vals{"Jeff", "Jeffers", false},
)
insertSQL, args, _ := ds.ToSQL()
fmt.Println(insertSQL, args)
}
Output: INSERT INTO "user" ("first_name", "last_name", "is_verified") VALUES ('Greg', 'Farley', TRUE), ('Jimmy', 'Stewart', TRUE), ('Jeff', 'Jeffers', FALSE) []