Documentation ¶
Overview ¶
Package twowaysql provides an implementation of 2WaySQL.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Eval ¶
Eval returns converted query and bind value. inputParams takes a tagged struct. Tags must be in the form `map:"tag_name"`. The return value is expected to be used to issue queries to the database
Example ¶
package main import ( "fmt" "gitlab.com/osaki-lab/twowaysql" ) func main() { type Info struct { Name string `twowaysql:"name"` EmpNo int `twowaysql:"EmpNo"` MaxEmpNo int `twowaysql:"maxEmpNo"` DeptNo int `twowaysql:"deptNo"` Email string `twowaysql:"email"` GenderList []string `twowaysql:"gender_list"` IntList []int `twowaysql:"int_list"` } var params = Info{ Name: "Jeff", MaxEmpNo: 3, DeptNo: 12, GenderList: []string{"M", "F"}, IntList: []int{1, 2, 3}, } var before = `SELECT * FROM person WHERE employee_no = /*maxEmpNo*/1000 AND /* IF int_list !== null */ person.gender in /*int_list*/(3,5,7) /* END */` after, afterParams, _ := twowaysql.Eval(before, ¶ms) fmt.Println(after) fmt.Println(afterParams) }
Output: SELECT * FROM person WHERE employee_no = ?/*maxEmpNo*/ AND person.gender in (?, ?, ?)/*int_list*/ [3 1 2 3]
Types ¶
type Twowaysql ¶
type Twowaysql struct {
// contains filtered or unexported fields
}
Twowaysql is a struct for issuing 2WaySQL query
func (*Twowaysql) Exec ¶
Exec is a thin wrapper around db.Exec in the sqlx package. params takes a tagged struct. The tags format must be `twowaysql:"tag_name"`.
Example ¶
package main import ( "context" "log" "gitlab.com/osaki-lab/twowaysql" ) var ( tw *twowaysql.Twowaysql ctx context.Context ) func main() { type Info struct { Name string `twowaysql:"name"` EmpNo int `twowaysql:"EmpNo"` MaxEmpNo int `twowaysql:"maxEmpNo"` DeptNo int `twowaysql:"deptNo"` Email string `twowaysql:"email"` GenderList []string `twowaysql:"gender_list"` IntList []int `twowaysql:"int_list"` } var params = Info{ MaxEmpNo: 3, DeptNo: 12, } result, err := tw.Exec(ctx, `UPDATE persons SET dept_no = /*deptNo*/1 WHERE employee_no = /*EmpNo*/1`, ¶ms) if err != nil { log.Fatal(err) } rows, err := result.RowsAffected() if err != nil { log.Fatal(err) } if rows != 1 { log.Fatalf("expected to affect 1 row. affected %d", rows) } }
Output:
func (*Twowaysql) Select ¶
func (t *Twowaysql) Select(ctx context.Context, dest interface{}, query string, params interface{}) error
Select is a thin wrapper around db.Select in the sqlx package. params takes a tagged struct. The tags format must be `twowaysql:"tag_name"`. dest takes a pointer to a slice of a struct. The struct tag format must be `db:"tag_name"`.
Example ¶
package main import ( "context" "log" "gitlab.com/osaki-lab/twowaysql" ) var ( tw *twowaysql.Twowaysql ctx context.Context ) func main() { type Person struct { FirstName string `db:"first_name"` LastName string `db:"last_name"` Email string `db:"email"` } type Info struct { Name string `twowaysql:"name"` EmpNo int `twowaysql:"EmpNo"` MaxEmpNo int `twowaysql:"maxEmpNo"` DeptNo int `twowaysql:"deptNo"` Email string `twowaysql:"email"` GenderList []string `twowaysql:"gender_list"` IntList []int `twowaysql:"int_list"` } var params = Info{ MaxEmpNo: 3, DeptNo: 12, } var people []Person err := tw.Select(ctx, &people, `SELECT first_name, last_name, email FROM persons WHERE employee_no < /*maxEmpNo*/1000 /* IF deptNo */ AND dept_no < /*deptNo*/1 /* END */`, ¶ms) if err != nil { log.Fatal(err) } }
Output: