Package sqlx
provides a set of flexible and powerful SQL builders, not ORM, which is inspired by go-sqlbuilder. The built result can be used by DB.Query()
and DB.Exec()
$ go get -u github.com/xgfone/go-sqlx
package main
import (
"fmt"
"github.com/xgfone/go-op"
"github.com/xgfone/go-sqlx"
)
func main() {
builder := sqlx.Select("*").From("table")
builder.Where(op.Equal("id", 123), op.Between("age", 20, 30))
// You can set the dialect by hand, which is DefaultDialect by default.
// DefaultDialect is the MySQL dialect, but you can modify it.
// builder.SetDialect(Sqlite3)
sql, args := builder.Build()
fmt.Println(sql)
fmt.Println(args)
// Output:
// SELECT * FROM `table` WHERE (`id`=? AND `age` BETWEEN ? AND ?)
// [123 20 30]
}
You can use sqlx.DB
, which is the proxy of builder and sql.DB
, it will automatically set the dialect by the sql driver name. For example,
// Set the dialect to MySQL.
db, _ := sqlx.Open("mysql", "user:password@tcp(127.0.0.1:3306)/db")
builder := db.Select("*").From("table").Where(op.Equal("id", 123))
sql, args := builder.Build()
rows := db.QueryRows(sql, args.Args()...)
// Or
// rows := builder.QueryRows()
if rows.Err != nil {
// TODO: ...
return
}
defer rows.Close()
// TODO: ...
package main
import (
"fmt"
"github.com/xgfone/go-op"
"github.com/xgfone/go-sqlx"
)
func main() {
// Open DB connecting the mysql server and set the dialect to MySQL.
db, err := sqlx.Open("mysql", "user:password@tcp(127.0.0.1:3306)/db")
if err != nil {
fmt.Println(err)
return
}
defer db.Close()
// Set the interceptor to print the sql statement.
db.Interceptor = sqlx.InterceptorFunc(func(sql string, args []any) (string, []any, error) {
fmt.Println(sql)
return sql, args, nil
})
// Build the SELECT SQL statement
builder := db.Select("*").From("table")
builder.Where(op.Equal("id", 123))
rows := builder.QueryRows()
if rows.Err != nil {
fmt.Println(err)
return
}
// TODO: ...
// Interceptor will output:
// SELECT * FROM `table` WHERE `id`=?
}