Documentation ¶
Overview ¶
Package sqlbuilder is a flexible and powerful tool to build SQL string and associated args.
Index ¶
- Variables
- func Escape(ident string) string
- func EscapeAll(ident ...string) []string
- func Flatten(slices interface{}) (flattened []interface{})
- func List(arg interface{}) interface{}
- func Named(name string, arg interface{}) interface{}
- func Raw(expr string) interface{}
- type Args
- type Builder
- type Cond
- func (c *Cond) And(andExpr ...string) string
- func (c *Cond) Between(field string, lower, upper interface{}) string
- func (c *Cond) E(field string, value interface{}) string
- func (c *Cond) Equal(field string, value interface{}) string
- func (c *Cond) G(field string, value interface{}) string
- func (c *Cond) GE(field string, value interface{}) string
- func (c *Cond) GreaterEqualThan(field string, value interface{}) string
- func (c *Cond) GreaterThan(field string, value interface{}) string
- func (c *Cond) In(field string, value ...interface{}) string
- func (c *Cond) IsNotNull(field string) string
- func (c *Cond) IsNull(field string) string
- func (c *Cond) L(field string, value interface{}) string
- func (c *Cond) LE(field string, value interface{}) string
- func (c *Cond) LessEqualThan(field string, value interface{}) string
- func (c *Cond) LessThan(field string, value interface{}) string
- func (c *Cond) Like(field string, value interface{}) string
- func (c *Cond) LikeBinary(field string, value interface{}) string
- func (c *Cond) NE(field string, value interface{}) string
- func (c *Cond) NotBetween(field string, lower, upper interface{}) string
- func (c *Cond) NotEqual(field string, value interface{}) string
- func (c *Cond) NotIn(field string, value ...interface{}) string
- func (c *Cond) NotLike(field string, value interface{}) string
- func (c *Cond) NotLikeBinary(field string, value interface{}) string
- func (c *Cond) Or(orExpr ...string) string
- func (c *Cond) Var(value interface{}) string
- type DeleteBuilder
- func (db *DeleteBuilder) Build() (sql string, args []interface{})
- func (db *DeleteBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{})
- func (db *DeleteBuilder) DeleteFrom(table string) *DeleteBuilder
- func (db *DeleteBuilder) SetFlavor(flavor Flavor) (old Flavor)
- func (db *DeleteBuilder) String() string
- func (db *DeleteBuilder) Where(andExpr ...string) *DeleteBuilder
- type Flavor
- type InsertBuilder
- func (ib *InsertBuilder) Build() (sql string, args []interface{})
- func (ib *InsertBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{})
- func (ib *InsertBuilder) Cols(col ...string) *InsertBuilder
- func (ib *InsertBuilder) InsertInto(table string) *InsertBuilder
- func (ib *InsertBuilder) SetFlavor(flavor Flavor) (old Flavor)
- func (ib *InsertBuilder) String() string
- func (ib *InsertBuilder) Values(value ...interface{}) *InsertBuilder
- type JoinOption
- type SelectBuilder
- func (sb *SelectBuilder) As(name, alias string) string
- func (sb *SelectBuilder) Asc() *SelectBuilder
- func (sb *SelectBuilder) Build() (sql string, args []interface{})
- func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{})
- func (sb *SelectBuilder) BuilderAs(builder Builder, alias string) string
- func (sb *SelectBuilder) Desc() *SelectBuilder
- func (sb *SelectBuilder) Distinct() *SelectBuilder
- func (sb *SelectBuilder) ForUpdate() *SelectBuilder
- func (sb *SelectBuilder) From(table ...string) *SelectBuilder
- func (sb *SelectBuilder) GroupBy(col ...string) *SelectBuilder
- func (sb *SelectBuilder) Having(andExpr ...string) *SelectBuilder
- func (sb *SelectBuilder) Join(table string, onExpr ...string) *SelectBuilder
- func (sb *SelectBuilder) JoinWithOption(option JoinOption, table string, onExpr ...string) *SelectBuilder
- func (sb *SelectBuilder) Limit(limit int) *SelectBuilder
- func (sb *SelectBuilder) Offset(offset int) *SelectBuilder
- func (sb *SelectBuilder) OrderBy(col ...string) *SelectBuilder
- func (sb *SelectBuilder) Select(col ...string) *SelectBuilder
- func (sb *SelectBuilder) SetFlavor(flavor Flavor) (old Flavor)
- func (sb *SelectBuilder) String() string
- func (sb *SelectBuilder) Where(andExpr ...string) *SelectBuilder
- type Struct
- func (s *Struct) Addr(value interface{}) []interface{}
- func (s *Struct) AddrForTag(tag string, value interface{}) []interface{}
- func (s *Struct) AddrWithCols(cols []string, value interface{}) []interface{}
- func (s *Struct) DeleteFrom(table string) *DeleteBuilder
- func (s *Struct) For(flavor Flavor) *Struct
- func (s *Struct) InsertInto(table string, value ...interface{}) *InsertBuilder
- func (s *Struct) InsertIntoForTag(table string, tag string, value ...interface{}) *InsertBuilder
- func (s *Struct) SelectFrom(table string) *SelectBuilder
- func (s *Struct) SelectFromForTag(table string, tag string) *SelectBuilder
- func (s *Struct) Update(table string, value interface{}) *UpdateBuilder
- func (s *Struct) UpdateForTag(table string, tag string, value interface{}) *UpdateBuilder
- type UpdateBuilder
- func (ub *UpdateBuilder) Add(field string, value interface{}) string
- func (ub *UpdateBuilder) Assign(field string, value interface{}) string
- func (ub *UpdateBuilder) Build() (sql string, args []interface{})
- func (ub *UpdateBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{})
- func (ub *UpdateBuilder) Decr(field string) string
- func (ub *UpdateBuilder) Div(field string, value interface{}) string
- func (ub *UpdateBuilder) Incr(field string) string
- func (ub *UpdateBuilder) Mul(field string, value interface{}) string
- func (ub *UpdateBuilder) Set(assignment ...string) *UpdateBuilder
- func (ub *UpdateBuilder) SetFlavor(flavor Flavor) (old Flavor)
- func (ub *UpdateBuilder) String() string
- func (ub *UpdateBuilder) Sub(field string, value interface{}) string
- func (ub *UpdateBuilder) Update(table string) *UpdateBuilder
- func (ub *UpdateBuilder) Where(andExpr ...string) *UpdateBuilder
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( // DBTag is the struct tag to describe the name for a field in struct. DBTag = "db" // FieldTag is the struct tag to describe the tag name for a field in struct. // Use "," to separate different tags. FieldTag = "fieldtag" // FieldOpt is the options for a struct field. // As db column can contain "," in theory, field options should be provided in a separated tag. FieldOpt = "fieldopt" )
var ( // DefaultFlavor is the default flavor for all builders. DefaultFlavor = MySQL )
Functions ¶
func Flatten ¶
func Flatten(slices interface{}) (flattened []interface{})
Flatten recursively extracts values in slices and returns a flattened []interface{} with all values. If slices is not a slice, return `[]interface{}{slices}`.
func List ¶
func List(arg interface{}) interface{}
List marks arg as a list of data. If arg is `[]int{1, 2, 3}`, it will be compiled to `?, ?, ?` with args `[1 2 3]`.
Types ¶
type Args ¶
type Args struct { // The default flavor used by `Args#Compile` Flavor Flavor // contains filtered or unexported fields }
Args stores arguments associated with a SQL.
func (*Args) Compile ¶
func (args *Args) Compile(format string, intialValue ...interface{}) (query string, values []interface{})
Compile compiles builder's format to standard sql and returns associated args.
The format string uses a special syntax to represent arguments.
$? refers successive arguments passed in the call. It works similar as `%v` in `fmt.Sprintf`. $0 $1 ... $n refers nth-argument passed in the call. Next $? will use arguments n+1. ${name} refers a named argument created by `Named` with `name`. $$ is a "$" string.
func (*Args) CompileWithFlavor ¶
func (args *Args) CompileWithFlavor(format string, flavor Flavor, intialValue ...interface{}) (query string, values []interface{})
CompileWithFlavor compiles builder's format to standard sql with flavor and returns associated args.
See doc for `Compile` to learn details. nolint:gocyclo,lll
type Builder ¶
type Builder interface { Build() (sql string, args []interface{}) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{}) }
Builder is a general SQL builder. It's used by Args to create nested SQL like the `IN` expression in `SELECT * FROM t1 WHERE id IN (SELECT id FROM t2)`.
func Build ¶
Build creates a Builder from a format string. The format string uses special syntax to represent arguments. See doc in `Args#Compile` for syntax details.
Example ¶
sb := NewSelectBuilder() sb.Select("id").From("user").Where(sb.In("status", 1, 2)) b := Build("EXPLAIN $? LEFT JOIN SELECT * FROM $? WHERE created_at > $? AND state IN (${states}) AND modified_at BETWEEN $2 AND $?", sb, Raw("banned"), 1514458225, 1514544625, Named("states", List([]int{3, 4, 5}))) stmt, args := b.Build() fmt.Println(stmt) fmt.Println(args)
Output: EXPLAIN SELECT id FROM user WHERE status IN (?, ?) LEFT JOIN SELECT * FROM banned WHERE created_at > ? AND state IN (?, ?, ?) AND modified_at BETWEEN ? AND ? [1 2 1514458225 3 4 5 1514458225 1514544625]
func BuildNamed ¶
BuildNamed creates a Builder from a format string. The format string uses `${key}` to refer the value of named by key.
Example ¶
b := BuildNamed("SELECT * FROM ${table} WHERE status IN (${status}) AND name LIKE ${name} AND created_at > ${time} AND modified_at < ${time} + 86400", map[string]interface{}{ "time": sql.Named("start", 1234567890), "status": List([]int{1, 2, 5}), "name": "Huan%", "table": Raw("user"), }) stmt, args := b.Build() fmt.Println(stmt) fmt.Println(args)
Output: SELECT * FROM user WHERE status IN (?, ?, ?) AND name LIKE ? AND created_at > @start AND modified_at < @start + 86400 [1 2 5 Huan% {{} start 1234567890}]
func Buildf ¶
Buildf creates a Builder from a format string using `fmt.Sprintf`-like syntax. As all arguments will be converted to a string internally, e.g. "$0", only `%v` and `%s` are valid.
Example ¶
sb := NewSelectBuilder() sb.Select("id").From("user") explain := Buildf("EXPLAIN %v LEFT JOIN SELECT * FROM banned WHERE state IN (%v, %v)", sb, 1, 2) stmt, args := explain.Build() fmt.Println(stmt) fmt.Println(args)
Output: EXPLAIN SELECT id FROM user LEFT JOIN SELECT * FROM banned WHERE state IN (?, ?) [1 2]
func WithFlavor ¶
WithFlavor creates a new Builder based on builder with a default flavor.
Example ¶
stmt, args := WithFlavor(Buildf("SELECT * FROM foo WHERE id = %v", 1234), PostgreSQL).Build() fmt.Println(stmt) fmt.Println(args) // Explicitly use MySQL as the flavor. stmt, args = WithFlavor(Buildf("SELECT * FROM foo WHERE id = %v", 1234), PostgreSQL).BuildWithFlavor(MySQL) fmt.Println(stmt) fmt.Println(args)
Output: SELECT * FROM foo WHERE id = $1 [1234] SELECT * FROM foo WHERE id = ? [1234]
type Cond ¶
type Cond struct {
Args *Args
}
Cond provides several helper methods to build conditions.
func (*Cond) GreaterEqualThan ¶
GreaterEqualThan represents "field >= value".
func (*Cond) GreaterThan ¶
GreaterThan represents "field > value".
func (*Cond) LessEqualThan ¶
LessEqualThan represents "field <= value".
func (*Cond) LikeBinary ¶
LikeBinary represents "field LIKE BINARY value".
func (*Cond) NotBetween ¶
NotBetween represents "field NOT BETWEEN lower AND upper".
func (*Cond) NotLikeBinary ¶
NotLikeBinary represents "field NOT LIKE BINARY value".
type DeleteBuilder ¶
type DeleteBuilder struct { Cond // contains filtered or unexported fields }
DeleteBuilder is a builder to build DELETE.
Example ¶
db := NewDeleteBuilder() db.DeleteFrom("demo.user") db.Where( db.GreaterThan("id", 1234), db.Like("name", "%Du"), db.Or( db.IsNull("id_card"), db.In("status", 1, 2, 5), ), "modified_at > created_at + "+db.Var(86400), // It's allowed to write arbitrary SQL. ) sql, args := db.Build() fmt.Println(sql) fmt.Println(args)
Output: DELETE FROM demo.user WHERE id > ? AND name LIKE ? AND (id_card IS NULL OR status IN (?, ?, ?)) AND modified_at > created_at + ? [1234 %Du 1 2 5 86400]
func NewDeleteBuilder ¶
func NewDeleteBuilder() *DeleteBuilder
NewDeleteBuilder creates a new DELETE builder.
func (*DeleteBuilder) Build ¶
func (db *DeleteBuilder) Build() (sql string, args []interface{})
Build returns compiled DELETE string and args. They can be used in `DB#Query` of package `database/sql` directly.
func (*DeleteBuilder) BuildWithFlavor ¶
func (db *DeleteBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{})
BuildWithFlavor returns compiled DELETE string and args with flavor and initial args. They can be used in `DB#Query` of package `database/sql` directly.
func (*DeleteBuilder) DeleteFrom ¶
func (db *DeleteBuilder) DeleteFrom(table string) *DeleteBuilder
DeleteFrom sets table name in DELETE.
func (*DeleteBuilder) SetFlavor ¶
func (db *DeleteBuilder) SetFlavor(flavor Flavor) (old Flavor)
SetFlavor sets the flavor of compiled sql.
func (*DeleteBuilder) String ¶
func (db *DeleteBuilder) String() string
String returns the compiled DELETE string.
func (*DeleteBuilder) Where ¶
func (db *DeleteBuilder) Where(andExpr ...string) *DeleteBuilder
Where sets expressions of WHERE in DELETE.
type Flavor ¶
type Flavor int
Flavor is the flag to control the format of compiled sql.
Example ¶
// Create a flavored builder. sb := PostgreSQL.NewSelectBuilder() sb.Select("name").From("user").Where( sb.E("id", 1234), sb.G("rank", 3), ) sql, args := sb.Build() fmt.Println(sql) fmt.Println(args)
Output: SELECT name FROM user WHERE id = $1 AND rank > $2 [1234 3]
const ( MySQL Flavor PostgreSQL )
Supported flavors.
func (Flavor) NewDeleteBuilder ¶
func (f Flavor) NewDeleteBuilder() *DeleteBuilder
NewDeleteBuilder creates a new DELETE builder with flavor.
func (Flavor) NewInsertBuilder ¶
func (f Flavor) NewInsertBuilder() *InsertBuilder
NewInsertBuilder creates a new INSERT builder with flavor.
func (Flavor) NewSelectBuilder ¶
func (f Flavor) NewSelectBuilder() *SelectBuilder
NewSelectBuilder creates a new SELECT builder with flavor.
func (Flavor) NewUpdateBuilder ¶
func (f Flavor) NewUpdateBuilder() *UpdateBuilder
NewUpdateBuilder creates a new UPDATE builder with flavor.
type InsertBuilder ¶
type InsertBuilder struct {
// contains filtered or unexported fields
}
InsertBuilder is a builder to build INSERT.
Example ¶
ib := NewInsertBuilder() ib.InsertInto("demo.user") ib.Cols("id", "name", "status", "created_at") ib.Values(1, "Huan Du", 1, Raw("UNIX_TIMESTAMP(NOW())")) ib.Values(2, "Charmy Liu", 1, 1234567890) sql, args := ib.Build() fmt.Println(sql) fmt.Println(args)
Output: INSERT INTO demo.user (id, name, status, created_at) VALUES (?, ?, ?, UNIX_TIMESTAMP(NOW())), (?, ?, ?, ?) [1 Huan Du 1 2 Charmy Liu 1 1234567890]
func NewInsertBuilder ¶
func NewInsertBuilder() *InsertBuilder
NewInsertBuilder creates a new INSERT builder.
func (*InsertBuilder) Build ¶
func (ib *InsertBuilder) Build() (sql string, args []interface{})
Build returns compiled INSERT string and args. They can be used in `DB#Query` of package `database/sql` directly.
func (*InsertBuilder) BuildWithFlavor ¶
func (ib *InsertBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{})
BuildWithFlavor returns compiled INSERT string and args with flavor and initial args. They can be used in `DB#Query` of package `database/sql` directly.
func (*InsertBuilder) Cols ¶
func (ib *InsertBuilder) Cols(col ...string) *InsertBuilder
Cols sets columns in INSERT.
func (*InsertBuilder) InsertInto ¶
func (ib *InsertBuilder) InsertInto(table string) *InsertBuilder
InsertInto sets table name in INSERT.
func (*InsertBuilder) SetFlavor ¶
func (ib *InsertBuilder) SetFlavor(flavor Flavor) (old Flavor)
SetFlavor sets the flavor of compiled sql.
func (*InsertBuilder) String ¶
func (ib *InsertBuilder) String() string
String returns the compiled DELETE string.
func (*InsertBuilder) Values ¶
func (ib *InsertBuilder) Values(value ...interface{}) *InsertBuilder
Values adds a list of values for a row in INSERT.
type JoinOption ¶
type JoinOption string
JoinOption is the option in JOIN.
const ( LeftJoin JoinOption = "LEFT" LeftOuterJoin JoinOption = "LEFT OUTER" RightJoin JoinOption = "RIGHT" RightOuterJoin JoinOption = "RIGHT OUTER" FullJoin JoinOption = "FULL" FullOuterJoin JoinOption = "FULL OUTER" )
Join options.
type SelectBuilder ¶
type SelectBuilder struct { Cond // contains filtered or unexported fields }
SelectBuilder is a builder to build SELECT.
Example ¶
sb := NewSelectBuilder() sb.Distinct().Select("id", "name", sb.As("COUNT(*)", "t")) sb.From("demo.user") sb.Where( sb.GreaterThan("id", 1234), sb.Like("name", "%Du"), sb.Or( sb.IsNull("id_card"), sb.In("status", 1, 2, 5), ), sb.NotIn( "id", NewSelectBuilder().Select("id").From("banned"), ), // Nested SELECT. "modified_at > created_at + "+sb.Var(86400), // It's allowed to write arbitrary SQL. ) sb.GroupBy("status").Having(sb.NotIn("status", 4, 5)) sb.OrderBy("modified_at").Asc() sb.Limit(10).Offset(5) stmt, args := sb.Build() fmt.Println(stmt) fmt.Println(args)
Output: SELECT DISTINCT id, name, COUNT(*) AS t FROM demo.user WHERE id > ? AND name LIKE ? AND (id_card IS NULL OR status IN (?, ?, ?)) AND id NOT IN (SELECT id FROM banned) AND modified_at > created_at + ? GROUP BY status HAVING status NOT IN (?, ?) ORDER BY modified_at ASC LIMIT 10 OFFSET 5 [1234 %Du 1 2 5 86400 4 5]
Example (AdvancedUsage) ¶
sb := NewSelectBuilder() innerSb := NewSelectBuilder() sb.Select("id", "name") sb.From( sb.BuilderAs(innerSb, "user"), ) sb.Where( sb.In("status", Flatten([]int{1, 2, 3})...), sb.Between("created_at", sql.Named("start", 1234567890), sql.Named("end", 1234599999)), ) sb.OrderBy("modified_at").Desc() innerSb.Select("*") innerSb.From("banned") innerSb.Where( innerSb.NotIn("name", Flatten([]string{"Huan Du", "Charmy Liu"})...), ) stmt, args := sb.Build() fmt.Println(stmt) fmt.Println(args)
Output: SELECT id, name FROM (SELECT * FROM banned WHERE name NOT IN (?, ?)) AS user WHERE status IN (?, ?, ?) AND created_at BETWEEN @start AND @end ORDER BY modified_at DESC [Huan Du Charmy Liu 1 2 3 {{} start 1234567890} {{} end 1234599999}]
Example (Join) ¶
sb := NewSelectBuilder() sb.Select("u.id", "u.name", "c.type", "p.nickname") sb.From("user u") sb.Join("contract c", "u.id = c.user_id", sb.In("c.status", 1, 2, 5), ) sb.JoinWithOption(RightOuterJoin, "person p", "u.id = p.user_id", sb.Like("p.surname", "%Du"), ) sb.Where( "u.modified_at > u.created_at + " + sb.Var(86400), // It's allowed to write arbitrary SQL. ) stmt, args := sb.Build() fmt.Println(stmt) fmt.Println(args)
Output: SELECT u.id, u.name, c.type, p.nickname FROM user u JOIN contract c ON u.id = c.user_id AND c.status IN (?, ?, ?) RIGHT OUTER JOIN person p ON u.id = p.user_id AND p.surname LIKE ? WHERE u.modified_at > u.created_at + ? [1 2 5 %Du 86400]
func NewSelectBuilder ¶
func NewSelectBuilder() *SelectBuilder
NewSelectBuilder creates a new SELECT builder.
func (*SelectBuilder) As ¶
func (sb *SelectBuilder) As(name, alias string) string
As returns an AS expression.
func (*SelectBuilder) Asc ¶
func (sb *SelectBuilder) Asc() *SelectBuilder
Asc sets order of ORDER BY to ASC.
func (*SelectBuilder) Build ¶
func (sb *SelectBuilder) Build() (sql string, args []interface{})
Build returns compiled SELECT string and args. They can be used in `DB#Query` of package `database/sql` directly.
func (*SelectBuilder) BuildWithFlavor ¶
func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{})
BuildWithFlavor returns compiled SELECT string and args with flavor and initial args. They can be used in `DB#Query` of package `database/sql` directly. nolint:gocyclo
func (*SelectBuilder) BuilderAs ¶
func (sb *SelectBuilder) BuilderAs(builder Builder, alias string) string
BuilderAs returns an AS expression wrapping a complex SQL. According to SQL syntax, SQL built by builder is surrounded by parens.
func (*SelectBuilder) Desc ¶
func (sb *SelectBuilder) Desc() *SelectBuilder
Desc sets order of ORDER BY to DESC.
func (*SelectBuilder) Distinct ¶
func (sb *SelectBuilder) Distinct() *SelectBuilder
Distinct marks this SELECT as DISTINCT.
func (*SelectBuilder) ForUpdate ¶
func (sb *SelectBuilder) ForUpdate() *SelectBuilder
ForUpdate add "FOR UPDATE" to SELECT
func (*SelectBuilder) From ¶
func (sb *SelectBuilder) From(table ...string) *SelectBuilder
From sets table names in SELECT.
func (*SelectBuilder) GroupBy ¶
func (sb *SelectBuilder) GroupBy(col ...string) *SelectBuilder
GroupBy sets columns of GROUP BY in SELECT.
func (*SelectBuilder) Having ¶
func (sb *SelectBuilder) Having(andExpr ...string) *SelectBuilder
Having sets expressions of HAVING in SELECT.
func (*SelectBuilder) Join ¶
func (sb *SelectBuilder) Join(table string, onExpr ...string) *SelectBuilder
Join sets expressions of JOIN in SELECT.
It builds a JOIN expression like
JOIN table ON onExpr[0] AND onExpr[1] ...
func (*SelectBuilder) JoinWithOption ¶
func (sb *SelectBuilder) JoinWithOption(option JoinOption, table string, onExpr ...string) *SelectBuilder
JoinWithOption sets expressions of JOIN with an option.
It builds a JOIN expression like
option JOIN table ON onExpr[0] AND onExpr[1] ...
Here is a list of supported options.
- LeftJoin: LEFT JOIN
- LeftOuterJoin: LEFT OUTER JOIN
- RightJoin: RIGHT JOIN
- RightOuterJoin: RIGHT OUTER JOIN
func (*SelectBuilder) Limit ¶
func (sb *SelectBuilder) Limit(limit int) *SelectBuilder
Limit sets the LIMIT in SELECT.
func (*SelectBuilder) Offset ¶
func (sb *SelectBuilder) Offset(offset int) *SelectBuilder
Offset sets the LIMIT offset in SELECT.
func (*SelectBuilder) OrderBy ¶
func (sb *SelectBuilder) OrderBy(col ...string) *SelectBuilder
OrderBy sets columns of ORDER BY in SELECT.
func (*SelectBuilder) Select ¶
func (sb *SelectBuilder) Select(col ...string) *SelectBuilder
Select sets columns in SELECT.
func (*SelectBuilder) SetFlavor ¶
func (sb *SelectBuilder) SetFlavor(flavor Flavor) (old Flavor)
SetFlavor sets the flavor of compiled sql.
func (*SelectBuilder) String ¶
func (sb *SelectBuilder) String() string
String returns the compiled SELECT string.
func (*SelectBuilder) Where ¶
func (sb *SelectBuilder) Where(andExpr ...string) *SelectBuilder
Where sets expressions of WHERE in SELECT.
type Struct ¶
type Struct struct { Flavor Flavor // contains filtered or unexported fields }
Struct represents a struct type.
All methods in Struct are thread-safe. We can define a global variable to hold a Struct and use it in any goroutine.
Example (BuildDELETE) ¶
// Suppose we defined following type and global variable. // // type User struct { // ID int64 `db:"id"` // Name string `db:"name"` // Status int `db:"status"` // } // // var userStruct = NewStruct(new(User)) // Prepare DELETE query. user := &User{ ID: 1234, Name: "Huan Du", Status: 1, } b := userStruct.DeleteFrom("user") b.Where(b.E("id", user.ID)) // Execute the query. sql, args := b.Build() db.Exec(sql, args...) fmt.Println(sql) fmt.Println(args)
Output: DELETE FROM user WHERE id = ? [1234]
Example (BuildINSERT) ¶
// Suppose we defined following type and global variable. // // type User struct { // ID int64 `db:"id"` // Name string `db:"name"` // Status int `db:"status"` // } // // var userStruct = NewStruct(new(User)) // Prepare INSERT query. user := &User{ ID: 1234, Name: "Huan Du", Status: 1, } ib := userStruct.InsertInto("user", user) // Execute the query. sql, args := ib.Build() db.Exec(sql, args...) fmt.Println(sql) fmt.Println(args)
Output: INSERT INTO user (id, name, status) VALUES (?, ?, ?) [1234 Huan Du 1]
Example (BuildUPDATE) ¶
// Suppose we defined following type and global variable. // // type User struct { // ID int64 `db:"id"` // Name string `db:"name"` // Status int `db:"status"` // } // // var userStruct = NewStruct(new(User)) // Prepare UPDATE query. user := &User{ ID: 1234, Name: "Huan Du", Status: 1, } ub := userStruct.Update("user", user) ub.Where(ub.E("id", user.ID)) // Execute the query. sql, args := ub.Build() db.Exec(sql, args...) fmt.Println(sql) fmt.Println(args)
Output: UPDATE user SET id = ?, name = ?, status = ? WHERE id = ? [1234 Huan Du 1 1234]
Example (ForPostgreSQL) ¶
userStruct := NewStruct(new(User)).For(PostgreSQL) sb := userStruct.SelectFrom("user") sb.Where(sb.E("id", 1234)) sql, args := sb.Build() fmt.Println(sql) fmt.Println(args)
Output: SELECT id, name, status FROM user WHERE id = $1 [1234]
Example (UseStructAsORM) ¶
// Suppose we defined following type and global variable. // // type User struct { // ID int64 `db:"id"` // Name string `db:"name"` // Status int `db:"status"` // } // // var userStruct = NewStruct(new(User)) // Prepare SELECT query. sb := userStruct.SelectFrom("user") sb.Where(sb.E("id", 1234)) // Execute the query. sql, args := sb.Build() rows, _ := db.Query(sql, args...) defer func(rows testRows) { _ = rows.Close() }(rows) // Scan row data to user. var user User _ = rows.Scan(userStruct.Addr(&user)...) fmt.Println(sql) fmt.Println(args) fmt.Printf("%#v", user)
Output: SELECT id, name, status FROM user WHERE id = ? [1234] sqlbuilder.User{ID:1234, Name:"huandu", Status:1}
Example (UseTag) ¶
// Suppose we defined following type and global variable. // // type Order struct { // ID int64 `db:"id" fieldtag:"update,paid"` // State int `db:"state" fieldtag:"paid"` // SkuID int64 `db:"sku_id"` // UserID int64 `db:"user_id"` // Price int64 `db:"price" fieldtag:"update"` // Discount int64 `db:"discount" fieldtag:"update"` // Description string `db:"description" fieldtag:"update"` // CreatedAt int64 `db:"created_at"` // ModifiedAt int64 `db:"modified_at" fieldtag:"update,paid"` // } // // var orderStruct = NewStruct(new(Order)) createOrder := func(table string) { now := time.Now().Unix() order := &Order{ ID: 1234, State: OrderStateCreated, SkuID: 5678, UserID: 7527, Price: 1000, Discount: 0, Description: "Best goods", CreatedAt: now, ModifiedAt: now, } b := orderStruct.InsertInto(table, &order) sql, args := b.Build() db.Exec(sql, args) } updatePrice := func(table string) { tag := "update" // Read order from database. var order Order sql, args := orderStruct.SelectFromForTag(table, tag).Where("id = 1234").Build() rows, _ := db.Query(sql, args...) defer rows.Close() _ = rows.Scan(orderStruct.AddrForTag(tag, &order)...) // Discount for this user. // Use tag "update" to update necessary columns only. order.Discount += 100 order.ModifiedAt = time.Now().Unix() // Save the order. b := orderStruct.UpdateForTag(table, tag, &order) b.Where(b.E("id", order.ID)) sql, args = b.Build() db.Exec(sql, args...) } updateState := func(table string) { tag := "paid" // Read order from database. var order Order sql, args := orderStruct.SelectFromForTag(table, tag).Where("id = 1234").Build() rows, _ := db.Query(sql, args...) defer func(rows testRows) { _ = rows.Close() }(rows) _ = rows.Scan(orderStruct.AddrForTag(tag, &order)...) // Update state to paid when user has paid for the order. // Use tag "paid" to update necessary columns only. if order.State != OrderStateCreated { // Report state error here. return } // Update order state. order.State = OrderStatePaid order.ModifiedAt = time.Now().Unix() // Save the order. b := orderStruct.UpdateForTag(table, tag, &order) b.Where(b.E("id", order.ID)) sql, args = b.Build() db.Exec(sql, args...) } table := "order" createOrder(table) updatePrice(table) updateState(table) fmt.Println("done")
Output: done
func NewStruct ¶
func NewStruct(structValue interface{}) *Struct
NewStruct analyzes type information in structValue and creates a new Struct with all structValue fields. If structValue is not a struct, NewStruct returns a dummy Sturct.
func (*Struct) Addr ¶
func (s *Struct) Addr(value interface{}) []interface{}
Addr takes address of all exported fields of the s from the value. The returned result can be used in `Row#Scan` directly.
func (*Struct) AddrForTag ¶
AddrForTag takes address of all fields of the s tagged with tag from the value. The returned result can be used in `Row#Scan` directly.
If tag is not defined in s in advance,
func (*Struct) AddrWithCols ¶
AddrWithCols takes address of all columns defined in cols from the value. The returned result can be used in `Row#Scan` directly.
func (*Struct) DeleteFrom ¶
func (s *Struct) DeleteFrom(table string) *DeleteBuilder
DeleteFrom creates a new `DeleteBuilder` with table name.
Caller is responsible to set WHERE condition to match right record.
func (*Struct) InsertInto ¶
func (s *Struct) InsertInto(table string, value ...interface{}) *InsertBuilder
InsertInto creates a new `InsertBuilder` with table name. By default, all exported fields of the s is inserted in INSERT with the field values from value. Bulk insert is supported. Item in value that is not the same as that of s will be skipped. If no item in value is valid, InsertInto returns a dummy `InsertBuilder` with table name.
func (*Struct) InsertIntoForTag ¶
func (s *Struct) InsertIntoForTag(table string, tag string, value ...interface{}) *InsertBuilder
InsertIntoForTag creates a new `InsertBuilder` with table name. By default, all fields of the s tagged with tag is inserted in INSERT with the field values from value. Bulk insert is supported. Item in value that is not the same as that of s will be skipped. If no item in value is valid, InsertIntoForTag returns a dummy `InsertBuilder` with table name.
func (*Struct) SelectFrom ¶
func (s *Struct) SelectFrom(table string) *SelectBuilder
SelectFrom creates a new `SelectBuilder` with table name. By default, all exported fields of the s are listed as columns in SELECT.
Caller is responsible to set WHERE condition to find right record.
func (*Struct) SelectFromForTag ¶
func (s *Struct) SelectFromForTag(table string, tag string) *SelectBuilder
SelectFromForTag creates a new `SelectBuilder` with table name for a specified tag. By default, all fields of the s tagged with tag are listed as columns in SELECT.
Caller is responsible to set WHERE condition to find right record.
func (*Struct) Update ¶
func (s *Struct) Update(table string, value interface{}) *UpdateBuilder
Update creates a new `UpdateBuilder` with table name. By default, all exported fields of the s is assigned in UPDATE with the field values from value. If value's type is not the same as that of s, Update returns a dummy `UpdateBuilder` with table name.
Caller is responsible to set WHERE condition to match right record.
func (*Struct) UpdateForTag ¶
func (s *Struct) UpdateForTag(table string, tag string, value interface{}) *UpdateBuilder
UpdateForTag creates a new `UpdateBuilder` with table name. By default, all fields of the s tagged with tag is assigned in UPDATE with the field values from value. If value's type is not the same as that of s, UpdateForTag returns a dummy `UpdateBuilder` with table name.
Caller is responsible to set WHERE condition to match right record.
type UpdateBuilder ¶
type UpdateBuilder struct { Cond // contains filtered or unexported fields }
UpdateBuilder is a builder to build UPDATE.
Example ¶
ub := NewUpdateBuilder() ub.Update("demo.user") ub.Set( ub.Assign("type", "sys"), ub.Incr("credit"), "modified_at = UNIX_TIMESTAMP(NOW())", // It's allowed to write arbitrary SQL. ) ub.Where( ub.GreaterThan("id", 1234), ub.Like("name", "%Du"), ub.Or( ub.IsNull("id_card"), ub.In("status", 1, 2, 5), ), "modified_at > created_at + "+ub.Var(86400), // It's allowed to write arbitrary SQL. ) sql, args := ub.Build() fmt.Println(sql) fmt.Println(args)
Output: UPDATE demo.user SET type = ?, credit = credit + 1, modified_at = UNIX_TIMESTAMP(NOW()) WHERE id > ? AND name LIKE ? AND (id_card IS NULL OR status IN (?, ?, ?)) AND modified_at > created_at + ? [sys 1234 %Du 1 2 5 86400]
func NewUpdateBuilder ¶
func NewUpdateBuilder() *UpdateBuilder
NewUpdateBuilder creates a new UPDATE builder.
func (*UpdateBuilder) Add ¶
func (ub *UpdateBuilder) Add(field string, value interface{}) string
Add represents SET "field = field + value" in UPDATE.
func (*UpdateBuilder) Assign ¶
func (ub *UpdateBuilder) Assign(field string, value interface{}) string
Assign represents SET "field = value" in UPDATE.
func (*UpdateBuilder) Build ¶
func (ub *UpdateBuilder) Build() (sql string, args []interface{})
Build returns compiled UPDATE string and args. They can be used in `DB#Query` of package `database/sql` directly.
func (*UpdateBuilder) BuildWithFlavor ¶
func (ub *UpdateBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{}) (sql string, args []interface{})
BuildWithFlavor returns compiled UPDATE string and args with flavor and initial args. They can be used in `DB#Query` of package `database/sql` directly.
func (*UpdateBuilder) Decr ¶
func (ub *UpdateBuilder) Decr(field string) string
Decr represents SET "field = field - 1" in UPDATE.
func (*UpdateBuilder) Div ¶
func (ub *UpdateBuilder) Div(field string, value interface{}) string
Div represents SET "field = field / value" in UPDATE.
func (*UpdateBuilder) Incr ¶
func (ub *UpdateBuilder) Incr(field string) string
Incr represents SET "field = field + 1" in UPDATE.
func (*UpdateBuilder) Mul ¶
func (ub *UpdateBuilder) Mul(field string, value interface{}) string
Mul represents SET "field = field * value" in UPDATE.
func (*UpdateBuilder) Set ¶
func (ub *UpdateBuilder) Set(assignment ...string) *UpdateBuilder
Set sets the assignements in SET.
func (*UpdateBuilder) SetFlavor ¶
func (ub *UpdateBuilder) SetFlavor(flavor Flavor) (old Flavor)
SetFlavor sets the flavor of compiled sql.
func (*UpdateBuilder) String ¶
func (ub *UpdateBuilder) String() string
String returns the compiled UPDATE string.
func (*UpdateBuilder) Sub ¶
func (ub *UpdateBuilder) Sub(field string, value interface{}) string
Sub represents SET "field = field - value" in UPDATE.
func (*UpdateBuilder) Update ¶
func (ub *UpdateBuilder) Update(table string) *UpdateBuilder
Update sets table name in UPDATE.
func (*UpdateBuilder) Where ¶
func (ub *UpdateBuilder) Where(andExpr ...string) *UpdateBuilder
Where sets expressions of WHERE in UPDATE.