go get github.com/lesismal/sqlw
Noted:
- 这里示例的结构体标签
db
,用于映射结构体与sql的表字段。 - 如果您想使用一些三方工具自动生成结构体或sql表,但是三方工具有自定义的结构体标签,您可以在
sqlw.Open
时指定结构体标签,或者用db.SetTag()
方法来修改该标签。
type Model struct {
Id int64 `db:"id"`
I int64 `db:"i"`
S string `db:"s"`
}
import (
_ "github.com/go-sql-driver/mysql"
"github.com/lesismal/sqlw"
)
// "db" 是您的结构体用于与sql表字段映射的标签, 如果您使用三方工具自动生成结构体或sql表,您可以根据该工具生成的实际标签作为参数
db, err := sqlw.Open("mysql", SqlConnStr, "db")
if err != nil {
// handle err
}
tx, err := db.Begin()
if err != nil {
// handle err
}
defer tx.Rollback()
// curd logic
err = tx.Commit()
if err != nil {
// handle err
}
stmt, err := db.Prepare(`your sql`)
if err != nil {
// handle err
}
// curd logic using stmt
model := Model{
I: 1,
S: "str_1",
}
result, err := db.Insert("insert into sqlw_test.sqlw_test", &model)
// result, err := db.Insert("insert into sqlw_test.sqlw_test(i,s)", &model) // 插入结构体指定字段
if err != nil {
log.Panic(err)
}
log.Println("sql:", result.Sql())
var models []*Model
for i:=0; i<3; i++{
models = append(models, &Model{
I: i,
S: fmt.Sprintf("str_%v", i),
})
}
result, err := db.Insert("insert into sqlw_test.sqlw_test", models)
// result, err := db.Insert("insert into sqlw_test.sqlw_test(i,s)", models) // 插入结构体指定字段
if err != nil {
log.Panic(err)
}
log.Println("sql:", result.Sql())
deleteId := 1
result, err := db.Delete("delete from sqlw_test.sqlw_test where id=?", deleteId)
if err != nil {
log.Panic(err)
}
log.Println("sql:", result.Sql())
m := Model{
I: 10,
S: "str_10",
}
updateId := 1
result, err := db.Update("update sqlw_test.sqlw_test set i=?, s=? where id=?", &m, updateId)
if err != nil {
log.Panic(err)
}
log.Println("sql:", result.Sql())
var model Model
selectId := 1
result, err := db.Select(&model, "select * from sqlw_test.sqlw_test where id=?", selectId)
// result, err := db.Select(&model, "select (i,s) from sqlw_test.sqlw_test where id=?", selectId) // 查询结构体指定字段
if err != nil {
log.Panic(err)
}
log.Println("model:", model)
log.Println("sql:", result.Sql())
var models []*Model // type []Model is also fine
result, err = db.Select(&models, "select * from sqlw_test.sqlw_test")
// result, err = db.Select(&models, "select (i,s) from sqlw_test.sqlw_test") // 查询结构体指定字段
if err != nil {
log.Panic(err)
}
for i, v := range models {
log.Printf("models[%v]: %v", i, v)
}
log.Println("sql:", result.Sql())
sqlw.DB/Tx/Stmt
的所有Query/QueryRow/Exec/Insert/Delete/Update/Select
相关方法都会返回(sqlw.Result, error)
, 其中的sqlw.Result
是非 nil 的,您可以通过sqlw.Result.Sql()
获取实际执行的sql语句及参数并辅助日志或调试。
例如:
result, err := db.Insert(`insert into t(a,b) values(?,?)`, 1, 2)
if err != nil {
// handle err
}
fmt.Println("sql:", result.Sql)
输出:
sql: insert into t(a,b) values(?,?), [1, 2]
请参考:sqlw_examples