Skip to content

Latest commit

 

History

History
190 lines (150 loc) · 4.17 KB

README_cn.md

File metadata and controls

190 lines (150 loc) · 4.17 KB

sqlw - raw and simple wrapped std sql

Doc Go Report Card MIT licensed

安装

go get github.com/lesismal/sqlw

使用

定义结构

Noted:

  1. 这里示例的结构体标签db,用于映射结构体与sql的表字段。
  2. 如果您想使用一些三方工具自动生成结构体或sql表,但是三方工具有自定义的结构体标签,您可以在 sqlw.Open 时指定结构体标签,或者用 db.SetTag() 方法来修改该标签。
type Model struct {
	Id int64  `db:"id"`
	I  int64  `db:"i"`
	S  string `db:"s"`
}

创建sqlw.DB实例

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/预编译

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())

获取执行的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