Gopher苦ORM久矣,发布个高效极简的rawsql库

lesismal · 2022-06-28 17:51:08 · 3892 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-06-28 17:51:08 的主题,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3892 次点击  
加入收藏 微博
2 回复  |  直到 2022-07-01 09:09:06
focusonline
focusonline · #1 · 3年之前

这个轮子和直接用SQL相比有啥优势呢? 和其他的ORM相比?

vluo_
vluo_ · #2 · 3年之前

曾经有人吼“苦sql久矣!”于是发明了orm...

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传