Help us shape the future of Go! Take the 2026 Go Developer Survey

mworm

package module
v0.5.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 11, 2026 License: MIT Imports: 23 Imported by: 0

README

mworm - High-Performance PostgreSQL ORM for Go

mworm 是一个专为 PostgreSQL 深度打造的高性能 Go 语言 ORM 库,基于 sqlx 与 pgx 封装。

它彻底摒弃了多方言兼容的历史包袱,全面释放 PostgreSQL 的核心杀手级特性:

  • 🚀 一等公民级 RETURNING:支持链式 .Returning("id").Scan(&id) 与 .Returning("*").One(&model),单次往返完成写入并直接回填自增主键与默认字段;
  • ⚡ 原生 JSONB 运算套件:提供包含 (@>)、被包含 (<@)、键存在检测 (jsonb_exists)、路径查询提取 (#>>) 等原生支持,无缝适配 GIN 倒排索引;
  • 📦 PostgreSQL 原生数组 (Array) 运算:支持数组包含 (@>)、数组相交/重叠 (&&)、元素包含 (? = ANY(column)) 以及单参数高性能替代 IN (column = ANY(?));
  • 🔍 原生大小写不敏感匹配 (ILIKE):支持 ILike("name", "%茅台%") 与结构体自动提取,杜绝 LOWER() 破坏 B-Tree 索引;
  • 🛡️ PostgreSQL 标识符规范:统一进行标识符双引号规范保护,消除保留字冲突;
  • 🔄 高性能 BulkInsert 与原子分批 (Chunk):原生 $1, $2... 占位符风格,支持自动事务分批与 Context 超时秒级取消短路;
  • 📥 原生 Binary COPY 批量导入 (CopyFrom):基于 pgx 的 COPY ... FROM STDIN BINARY 协议,不生成 INSERT 语句与占位符,适合行情、K 线等大批量追加写入;可挂载到现有事务中随事务提交或回滚;
  • 🔒 防呆 WherePK 安全防线:更新/删除时主键空值强行阻断,杜绝全表误更新与误删除;
  • 🧱 全表操作拦截:无 WHERE 的 UPDATE/DELETE 默认拒绝执行(ErrFullTableOperation),需显式 AllowFullTable();
  • 🔐 行级锁与事务选项:ForUpdate() / ForUpdate("SKIP LOCKED") 与 TransactionWithOptions 支持隔离级别/只读事务。

v0.5.0 变更说明(自 v0.4.x 升级必读)

新增能力

能力 说明
CopyFrom(slice) / client.CopyFrom(slice) PostgreSQL 原生 Binary COPY 批量导入,支持 Table(含 schema.table)、Fields、ExcludeFields、Tx、WithContext 链式配置;仅追加写入,不支持冲突更新
AllowFullTable() 显式放行无条件 UPDATE/DELETE
ForUpdate(mode...) 追加 FOR UPDATE,mode 仅允许 NOWAIT / SKIP LOCKED
TransactionWithOptions(ctx, opts, fn) 托管事务支持 sql.TxOptions(隔离级别、只读),全局与 Client 均提供
RawSQL(sql, args...) / client.RawSQL(sql, args...) 原生查询支持参数绑定,? 与 $N 均可
SetExpression(tag, expr, args...) 表达式更新支持 $N 参数,如原子扣减 SetExpression("points", "points - $1", n)
db:"updated_at,at" 带 at 标记的列在每次 UPDATE 时自动写入 now()
IN(tag, slice) 切片参数自动展开;空 IN 生成恒假条件 1=0,空 NOT IN 自动忽略
uint 系列字段 查询结果支持绑定到 uint/uint8/.../uint64(负数或溢出返回错误)
WhereIf(cond, cgs...) 根据布尔条件流式动态追加条件,true 时生效,false 时忽略,消除多分支样板代码
Pluck(field, dest) 单列轻量切片提取(&[]string/&[]int64等),强制限定投影列,杜绝大宽表 SELECT * 开销
嵌套事务与 SAVEPOINT 托管事务检测到活跃 context 时自动转为 PostgreSQL 原生保存点,支持局部异常安全回滚
Context 事务自动传播 通过 WithTx(ctx, tx) 注入后,下游 .WithContext(ctx) 自动继承事务,无需显式 .Tx(tx)
编译期强类型 Fluent Builder 采用 Typestate 状态机模式,SELECT/INSERT/UPDATE/DELETE 分别返回独立强类型构建器(*SelectBuilder, *InsertBuilder, *UpdateBuilder, *DeleteBuilder)。IDE 仅展示当前动词合法方法,编译期直接阻断跨操作错配

行为变更(可能影响存量代码)

  1. 无 WHERE 的 UPDATE/DELETE 返回 ErrFullTableOperation,需改为 AllowFullTable() 显式放行。
  2. Upsert(...) 自动模式只更新本次 INSERT 实际写入的列,不再用零值覆盖未写入的列;显式 DoUpdate(...) 行为不变。
  3. SetField / Having / Raw / Exists / SubQuery 全部改为参数化绑定(此前部分为字面量拼接),FullSQL() 中会看到 ? 占位符。
  4. Many 为覆盖语义:执行前清空目标切片(结果为空时得到非 nil 空切片);行绑定失败直接返回错误,不再静默跳过。
  5. OnSlowQuery 回调与慢查询日志收到的是参数化 SQL(不含参数值,避免敏感数据落日志);仅调试模式会内插参数值。
  6. Count/Sum/... 在带 JOIN / GROUP BY / DISTINCT 时自动包裹子查询计数,Paginate 联表分页计数结果正确。
  7. PAGE / Paginate 的 page < 1 自动按第 1 页处理。
  8. WherePK() 逐个校验主键值:复合主键任一值为空即返回 ErrFullTableOperation(此前会静默丢弃空主键,生成残缺 WHERE 误操作多行),SELECT 同样生效。
  9. UPDATE/DELETE 中显式传值的条件(如 Eq("deviceToken", token))值为空时返回 ErrFullTableOperation,含 AndGroup/OrGroup 嵌套内;SELECT 仍保持空值自动忽略的搜索语义。
  10. SQLParams.TxExec/TxMustExec 遇到构建期错误时直接返回错误或 panic,绝不执行残缺 SQL;占位符改用 tx.Rebind,不再依赖全局 SqlxDB。
  11. 时间戳映射到 string 字段:仅零点整输出日期(DATE 列行为不变),其余一律输出 2006-01-02 15:04:05(此前分钟或小时为 0 的时刻,如 15:00:00,会被截断为仅日期)。
  12. 编译期强类型构建器与动词物理隔离:mworm.SELECT、mworm.INSERT、mworm.UPDATE、mworm.DELETE 不再返回同一单体 *OrmModel,而是返回裁剪好专属合法方法集的强类型构建器(*SelectBuilder、*InsertBuilder、*UpdateBuilder、*DeleteBuilder)。在 INSERT 敲 . 物理不可见 Where/Limit,在 SELECT 敲 . 物理不可见 SetField/Exec 等;强行错配调用时,Go 编译器直接阻断。需要直接访问底层 *OrmModel 时可通过 .Model() 无感提取。

安装

go get github.com/ccxdd/mworm

快速开始

1. 初始化连接

在使用 mworm 之前,需要先绑定 sqlx.DB 对象(推荐使用官方高性能 pgx 驱动):

import (
    "github.com/ccxdd/mworm"
    "github.com/jmoiron/sqlx"
    _ "github.com/jackc/pgx/v5/stdlib"
    "log"
)

func initDB() {
    // 连接 PostgreSQL 数据库
    db, err := sqlx.Connect("pgx", "postgres://user:password@localhost:5432/dbname?sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }
    
    // 绑定到 mworm 全局实例(亦可使用 mworm.New(db) 创建独立实例)
    err = mworm.BindDB(db)
    if err != nil {
        log.Fatal(err)
    }
}
2. 定义模型与 Tag 规范

在 mworm 中,模型定义必须同时提供 db 和 json tag。

核心规范:调用时使用 json tag 还是 db tag?
  • db tag:仅用于映射数据库底层的物理列名(以及标识主键 pk、排除更新 eu 等)。
  • json tag:除了用于 JSON 序列化,在调用 mworm 的所有链式查询、条件构造器(如 mworm.Eq、mworm.And、mworm.Or 等)、排序(Asc、Desc)、字段设置(SetField、SetExpression)时,传入的字段名参数必须使用 json tag,绝对不能使用 db tag。

mworm 底层会自动解析并将传入的 json tag 转换为对应的 db tag 以生成正确的 SQL 语句。

单主键模型:

type User struct {
    ID        int64     `json:"id" db:"id,pk"`          // pk 标识主键
    Name      string    `json:"name" db:"name"`
    Age       int       `json:"age" db:"age"`
}

复合主键模型: mworm 完美支持多字段复合主键,在 WherePK、Upsert 等操作中会自动识别所有标记为 pk 的字段。

type Favorite struct {
    UserId   int64  `json:"userId" db:"user_id,pk"`     // 查询条件传参需用 json tag: "userId"
    Code     string `json:"code" db:"code,pk"`          // 多个 pk 标记构成的复合主键
    Name     string `json:"name" db:"name"`
}

func (f Favorite) TableName() string {
    return "favorite"
}

常用功能

1. CRUD 操作
插入 (Insert)
user := User{Name: "Tom", Age: 18}
// 基础插入
err := mworm.INSERT(user).Exec()

// PostgreSQL 链式 RETURNING: 获取单列或自增 ID
var id int64
err := mworm.INSERT(user).Returning("id").Scan(&id)

// PostgreSQL 链式 RETURNING: 单次往返直接回填完整实体结构体
var createdUser User
err := mworm.INSERT(user).Returning("*").One(&createdUser)
原生 COPY 批量导入 (CopyFrom) 与批量插入 (BulkInsert)

mworm 提供两种批量写入方式,按是否需要冲突处理选择:

  1. CopyFrom(大批量纯追加写入):基于 PostgreSQL 原生 COPY ... FROM STDIN BINARY 二进制协议,不生成 INSERT 语句与参数占位符,整批复用同一个行缓冲切片。适合分时、K 线、资金流等大批量追加写入。支持挂载现有事务(随事务提交/回滚)与 Context 超时取消;
  2. BulkInsert(需要 Upsert / OnConflict 时):生成单条 INSERT INTO ... VALUES (...), (...),支持 .Upsert()、.DoNothing()、.OnConflict().DoUpdate() 与 .Chunk(size) 自动分批。
// 1. CopyFrom 原生 COPY 批量导入
ticks := []StockTick{
    {Code: "600519", Price: 1800.5, Volume: 100, Time: time.Now()},
    // ... 数万行分时数据
}

// 基础导入(排除自增主键 id),返回写入行数
n, err := mworm.CopyFrom(ticks).
    ExcludeFields("id").
    Exec()

// 显式指定目标表(支持 schema.table)与白名单列(json tag,未知字段会返回错误)
n, err = mworm.CopyFrom(ticks).
    Table("market.stock_ticks_202610").
    Fields("code", "price", "volume", "time").
    Exec()

// 事务中执行:与事务内其他 SQL 共用同一连接,随事务提交或回滚
err = mworm.Transaction(ctx, func(tx *sqlx.Tx) error {
    _, err := mworm.CopyFrom(ticks).
        Tx(tx).
        ExcludeFields("id").
        Exec()
    return err
})

// 2. BulkInsert 批量插入(支持 Upsert 冲突更新)
users := []User{
    {ID: 1, Name: "Alice", Age: 20},
    {ID: 2, Name: "Bob", Age: 25},
}
// 遇到主键冲突时自动更新非主键字段
err = mworm.BulkInsert(users).
    Upsert("id").
    Chunk(500). // 超过 500 行自动原子分批执行
    Exec()

CopyFrom 使用约束

  • 仅支持纯追加写入,遇到唯一键冲突会整批失败;需要冲突更新请使用 BulkInsert().Upsert()。
  • 带 ei 标记的字段不会写入;结构体指针切片中含 nil 元素时返回错误,不会写入任何数据。
  • 传入已提交或已回滚的事务时返回 sql.ErrTxDone。
  • 事务模式通过读取 database/sql 内部字段获取底层 pgx 连接:同一事务在 CopyFrom 执行期间不要在其他 goroutine 中并发使用。
查询 (Select)
// 单条查询 (注意: 传入的字段名使用 json tag "id")
var user User
err := mworm.SELECT(User{}).
    Where(mworm.Eq("id", 1)).
    One(&user)

// 多条查询 (注意: 传入的字段名使用 json tag "age")
var users []User
err := mworm.SELECT(User{}).
    Where(mworm.Gt("age", 18)).
    Asc("age").
    Limit(10).
    Many(&users)

// 单列切片快速提取 (Pluck) - 强制限定投影列,杜绝 SELECT * 大宽表开销
var codes []string
err = mworm.SELECT(StockInfo{}).
    Where(mworm.Eq("industry", "白酒")).
    Pluck("code", &codes)
更新 (Update)
// 更新整个结构体(非空字段)
user.Name = "Jerry"
err := mworm.UPDATE(user).
    Where(mworm.Eq("id", 1)).
    Exec()

// 使用 WherePK() 自动根据主键更新 (支持单/复合主键)
// 1. 自动根据结构体中的 pk 字段生成 WHERE 条件
// 2. 自动在 SET 子句中排除主键字段,防止主键被修改
err := mworm.UPDATE(fav).WherePK().Exec()

// 更新指定字段 (注意: 传入的字段名使用 json tag "name", "status")
err := mworm.UPDATE(User{}).
    SetField("name", "Jerry").
    SetField("status", 2).
    Where(mworm.Eq("id", 1)).
    Exec()

// 使用自定义表达式更新 (SetExpression) (注意: 传入的字段名使用 json tag "age", "data")
err := mworm.UPDATE(User{}).
    SetExpression("age", "age + 1").
    SetExpression("data", "jsonb_set(data, '{last_active}', '\"2026-04-01\"')").
    Where(mworm.Eq("id", 1)).
    Exec()

// 表达式带参数 + 条件更新 = 原子扣减(余额不足时 0 行受影响,返回 ErrNoRowsAffected)
err := mworm.UPDATE(Account{}).
    SetExpression("points", "points - $1", 38).
    Where(mworm.Eq("id", uid), mworm.Gte("points", 38)).
    Exec()

// 更新空值或零值 (AllowEmpty) (默认情况下,结构体空值字段在 UPDATE 时会被忽略)
// 传入需要允许更新空值的字段的 json tag
err := mworm.UPDATE(User{Name: ""}).
    AllowEmpty("name").
    Where(mworm.Eq("id", 1)).
    Exec()

// 带 at 标记的列(如 `db:"updated_at,at"`)每次 UPDATE 自动写入 now(),无需手动赋值
删除 (Delete)
// 使用指定条件删除 (注意: 传入的字段名使用 json tag "id")
err := mworm.DELETE(User{}).
    Where(mworm.Eq("id", 1)).
    Exec()

// 使用主键删除
err := mworm.DELETE(fav).WherePK().Exec()

// 无 WHERE 的 UPDATE/DELETE 默认被拦截(ErrFullTableOperation),确需全表操作须显式放行
err := mworm.DELETE(TmpLog{}).AllowFullTable().Exec()
2. 条件构造

mworm 提供了丰富的条件构造器,支持链式调用。所有条件构造器的第一个字段名参数均需使用 json tag。

// 基础条件
mworm.And("name", "age")      // name = ? AND age = ? (使用 json tag "name", "age")
mworm.Eq("status", 1)         // status = 1 (使用 json tag "status")
mworm.Gt("age", 18)           // age > 18 (使用 json tag "age")
mworm.Lt("age", 60)           // age < 60
mworm.IN("status", 1, 2, 3)   // status IN (1, 2, 3)
mworm.NotIN("status", 4, 5)   // status NOT IN (4, 5)
mworm.Between("age", 18, 60)  // age BETWEEN 18 AND 60
mworm.Like("name")            // name LIKE '%value%'
mworm.ILike("name")           // name ILIKE '%value%' (PostgreSQL 忽略大小写)
mworm.NEqILike("name")        // name NOT ILIKE '%value%' (PostgreSQL 忽略大小写)

// 自动忽略空值 (非常适合搜索表单)
// 如果 name 或 age 为空值/零值,则该条件自动被忽略
mworm.AndAuto("name", "age")

// 组合条件
orm := mworm.SELECT(User{}).Where(
    mworm.AndAuto("name"),
    mworm.Gte("age", 18),
    mworm.NotIN("status", 0, -1),
    mworm.Between("createdAt", "2024-01-01", "2024-12-31"), // 使用 json tag "createdAt"
)

// 流式动态条件 (WhereIf) - true 时追加条件,false 时直接忽略
orm = mworm.SELECT(User{}).
    Where(mworm.Eq("status", 1)).
    WhereIf(keyword != "", mworm.ILike("name", "%"+keyword+"%")).
    WhereIf(minAge > 0, mworm.Gte("age", minAge))
OR/AND 嵌套分组
// (status=1 OR status=2) AND age>=18
mworm.SELECT(User{}).Where(
    mworm.OrGroup(mworm.Eq("status", 1), mworm.Eq("status", 2)),
    mworm.Gte("age", 18),
)
// → WHERE (status=? OR status=?) AND age>=?

// (age>=18 AND age<=60)
mworm.SELECT(User{}).Where(
    mworm.AndGroup(mworm.Gte("age", 18), mworm.Lte("age", 60)),
)
// → WHERE (age>=? AND age<=?)
EXISTS / NOT EXISTS
// EXISTS 子查询
mworm.SELECT(User{}).Where(
    mworm.Exists("SELECT 1 FROM orders WHERE orders.user_id = users.id"),
)

// NOT EXISTS 带参数
mworm.SELECT(User{}).Where(
    mworm.NotExists("SELECT 1 FROM blacklist WHERE user_id = users.id AND status = $1", "blocked"),
)
子查询 (SubQuery)
// WHERE id IN (子查询) (注意: 传入的字段名使用 json tag "id")
mworm.SELECT(User{}).Where(
    mworm.SubQuery("id", "IN", "SELECT user_id FROM orders WHERE amount > $1", 100),
)
// → WHERE id IN (SELECT user_id FROM orders WHERE amount > ?)
3. 聚合查询
// 计数
count, err := mworm.SELECT(User{}).Where(mworm.Gt("age", 18)).Count("*")

// 求和 (使用 json tag "score")
sum, err := mworm.SELECT(User{}).Where(mworm.Gt("age", 0)).Sum("score")

// 平均值 (使用 json tag "age")
avg, err := mworm.SELECT(User{}).Avg("age")

// 最小值 (使用 json tag "score")
min, err := mworm.SELECT(User{}).Min("score")

// 最大值 (使用 json tag "score")
max, err := mworm.SELECT(User{}).Max("score")
4. 分页查询

mworm.PAGE 提供高效的分页查询。

// page: 当前页码, pageSize: 每页数量
// excludeTags: 不需要返回的字段 json tag 数组
result, err := mworm.PAGE(User{}, 1, 10, []string{"password"}, 
    mworm.AndAuto("name"), // 搜索条件
    mworm.Desc("createdAt"), // 排序 (使用 json tag "createdAt")
)

if err != nil {
    log.Fatal(err)
}
fmt.Printf("Total: %d, List: %v\n", result.Total, result.List)
5. Upsert (ON CONFLICT)

PostgreSQL 的 INSERT ON CONFLICT 支持。

// 冲突时更新指定字段 (使用 json tag "name", "age")
err := mworm.INSERT(user).OnConflict("id").DoUpdate("name", "age").Exec()
// → INSERT INTO users (...) VALUES (...) ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name, age=EXCLUDED.age

// 极致简化的 Upsert (自动推断需要更新的字段,冲突字段使用 json tag "id")
// 仅更新本次 INSERT 实际写入的列,未写入(零值被忽略)的列保持数据库原值
err := mworm.INSERT(user).Upsert("id").Exec()

// 冲突时忽略
err := mworm.INSERT(user).OnConflict("id").DoNothing().Exec()
// → INSERT INTO users (...) VALUES (...) ON CONFLICT (id) DO NOTHING
6. 批量插入(BulkInsert)

BulkInsert 将同类型 slice 的 N 行数据合并为一条 SQL 发送给数据库,相比在循环中逐条调用 INSERT,数据库往返从 N 次降为 1 次,写入耗时从秒级降至毫秒级。

基础用法
// 准备 slice,元素类型须实现 ORMInterface(即有 TableName() 方法)
rows := []MoneyFlowMin{
    {TradeDate: "20260814", TradeMin: "0930", ThemeSymbol: "A", MainNetAmount: 100},
    {TradeDate: "20260814", TradeMin: "0930", ThemeSymbol: "B", MainNetAmount: -50},
    // ... 数百行
}

// 纯 INSERT(有冲突会报错)
err := mworm.BulkInsert(rows).Exec()

// Upsert:冲突时自动更新非冲突列(推荐)
// 冲突字段使用 json tag
err := mworm.BulkInsert(rows).
    Upsert("tradedate", "trademin", "theme_symbol").
    Exec()

// 冲突时忽略(不报错,不更新)
err := mworm.BulkInsert(rows).
    DoNothing("tradedate", "trademin", "theme_symbol").
    Exec()

// 手动指定冲突列和需要更新的列
err := mworm.BulkInsert(rows).
    OnConflict("tradedate", "trademin", "theme_symbol").
    DoUpdate("main_net_amount", "main_buy_amount").
    Exec()
排除某些列
// 排除 updated_at 列不写入(使用 json tag)
err := mworm.BulkInsert(rows).
    ExcludeFields("updatedAt").
    Upsert("id").
    Exec()
自动分批 (Chunking)

当批量写入数据量极大(如数千至上万行金融时序数据)时,单条 SQL 绑定参数可能超过数据库限制(如 PostgreSQL 的 65,535 参数上限)。可通过 .Chunk(size) 指定单批写入行数,mworm 会在事务中自动按批次执行,确保全量成功或全量回滚:

// 每批 1000 行分批写入,自动在同一事务中原子执行
err := mworm.BulkInsert(largeMinuteBars).
    Chunk(1000).
    OnConflict("code", "date", "time").
    DoNothing().
    Exec()
与 Batch / BatchArray 的区别
Batch / BatchArray BulkInsert
SQL 语句数量 N 条(每行一条 INSERT) 1 条
事务 1 个事务 1 个事务(内部自动管理)
数据库往返 N 次 1 次
适用场景 多种不同 ORM 操作混合(INSERT + UPDATE 等) 同类型 slice 批量写入
错误粒度 可逐行处理 全批成功或全批回滚
注意事项

零值字段行为:BulkInsert 对所有行全列写入(含零值),与单行 INSERT 会跳过零值字段的行为不同。
若某列可能为零且不希望写入,请用 ExcludeFields("jsonTag") 显式排除。

生成的 SQL 示例(3 行,9 列):

INSERT INTO moneyflow_min
  (tradedate, trademin, theme_symbol, theme_name, level, p_symbol,
   main_net_amount, main_buy_amount, main_sell_amount)
VALUES
  ($1, $2, $3, $4, $5, $6, $7, $8, $9),
  ($10, $11, $12, $13, $14, $15, $16, $17, $18),
  ($19, $20, $21, $22, $23, $24, $25, $26, $27)
ON CONFLICT (tradedate, trademin, theme_symbol) DO UPDATE SET
  theme_name = EXCLUDED.theme_name,
  main_net_amount = EXCLUDED.main_net_amount,
  ...
6. JOIN 查询
mworm.SELECT(User{}).
    Join(mworm.LeftJoin("orders", "o").
        On(mworm.JoinOn("t.id = o.user_id")).
        Select("order_no", "amount")).
    Where(mworm.Eq("t.is_active", true)).
    Many(&results)
7. 高级特性
批量操作与事务
// 批量执行多个操作
err := mworm.Batch(
    mworm.INSERT(User{Name: "A"}),
    mworm.INSERT(User{Name: "B"}),
)

// 事务支持
err := mworm.BatchFunc(func(tx *sqlx.Tx) error {
    // 在此处使用 tx 执行原生 sqlx 操作
    return nil
})
原生 SQL
// 执行原生 SQL($N 或 ? 占位符均可)
mworm.ExecRawSQL("UPDATE users SET status = $1 WHERE id = $2", 1, 100)

// 原生 SQL 查询映射(支持参数绑定)
var users []User
mworm.RawSQL("SELECT * FROM users WHERE age > $1 AND status = $2", 18, 1).Many(&users)
JSONB 支持 (PostgreSQL)
// 将查询结果聚合为 JSONB List
jsonStr, err := mworm.SELECT(User{}).JsonbListString()

// 将查询结果聚合为 JSONB Map
jsonMap, err := mworm.SELECT(User{}).JsonbMapString("id", "name")

// 复杂 JSONB & 数组查询条件 (使用 json tag "data", "tags")
mworm.SELECT(User{}).Where(
    mworm.JsonbContains("data", `{"role": "admin"}`), // data @> ?
    mworm.JsonbHasKey("data", "last_login"),          // data ? ?
    mworm.ArrayAny("tags", "golang"),                 // tags = ANY(?)
    mworm.ArrayOverlap("tags", []string{"a", "b"}),    // tags && ARRAY[...]
)

// 通用 PostgreSQL 运算符
mworm.PgOp("tags", "@>", `{"go"}`)

// 结构体与切片字段原生自动序列化入库:
// 当模型中包含未实现 driver.Valuer 的嵌套 struct/切片时(对应数据库 JSON/JSONB 列),
// INSERT、UPDATE 及 BulkInsert 时会自动通过 sonic 序列化为规范 JSON 文本传递给底层驱动,无需手动序列化。
type Profile struct {
    Age  int    `json:"age"`
    City string `json:"city"`
}
type UserInfo struct {
    ID      int64   `json:"id" db:"id,pk"`
    Profile Profile `json:"profile" db:"profile"` // 自动存为 JSONB
}
mworm.INSERT(UserInfo{ID: 1, Profile: Profile{Age: 18, City: "Shanghai"}}).Exec()
CTE (Common Table Expressions)
// 使用 WITH 子句构建 CTE
orm := mworm.SELECT(User{}).
    Where(mworm.Eq("status", 1)).
    With("active_users") // 定义 CTE 表名

// 生成: WITH active_users AS (SELECT * FROM users WHERE status=1) SELECT * FROM active_users
result := orm.FullSQL()
GROUP BY 分组
var result []struct {
    Name  string `json:"name" db:"name"`
    Count int    `json:"count" db:"count"`
}
mworm.SELECT(User{}).
    GroupBy(mworm.Fields("name"), mworm.Raw(`count(*)`)).
    Having("count(name) > $1", 1).
    Many(&result)
动态表名 (Table)

当模型没有定义 TableName() 方法,或者表名需要动态变化时(如分表场景):

// 显式指定表名进行查询
var users []User
err := mworm.Table("users_2026").
    Select(User{}).
    Where(mworm.Gt("age", 18)).
    Many(&users)
条件分支 (If)

用于在链式调用中根据业务逻辑条件动态拼接查询条件,避免打断链式调用:

// 根据 limitVar 的值动态决定是否添加 Limit 限制
err := mworm.SELECT(User{}).
    Where(mworm.Eq("status", 1)).
    If(func(o *mworm.OrmModel) {
        if limitVar > 0 {
            o.Limit(limitVar)
        }
    }).
    Many(&users)
JSONB 直接映射反序列化 (JsonbMap / JsonbList)

直接将 JSONB 聚合查询结果反序列化映射为 Go 结构体/切片,底层集成高性能 sonic 库:

// JsonbMap: 将聚合结果直接映射为 map
var idMap = make(map[string]string)
err := mworm.SELECT(User{}).JsonbMap(&idMap, "nickname", "phone")

// JsonbList: 将列表直接反序列化为切片
var userList []User
err := mworm.SELECT(User{}).JsonbList(&userList)

调试

开启调试模式,打印生成的 SQL 语句:

mworm.SELECT(User{}).Log(true).Many(&users)
// 或者全局开启
mworm.DebugMode = true

字段常量生成器

使用字段常量替代字符串,提供编译期检查和 IDE 自动补全。生成的常量映射的即是字段的 json tag。

使用示例

假设你的项目结构如下:

myproject/
├── go.mod           # require github.com/ccxdd/mworm
├── models/
│   ├── user.go      # 包含 User 结构体
│   └── order.go     # 包含 Order 结构体
└── main.go

运行生成器:

cd /path/to/myproject

// 方式1:直接运行(推荐,无需安装)
go run github.com/ccxdd/mworm/cmd/fieldgen -dir=models/ -r

// 方式2:全局安装后使用
go install github.com/ccxdd/mworm/cmd/fieldgen@latest
fieldgen -dir=models/ -r

或在模型文件中添加 go generate 指令:

//go:generate go run github.com/ccxdd/mworm/cmd/fieldgen -src=$GOFILE

type User struct {
    // ...
}

然后运行 go generate ./... 即可自动生成。

生成结果:

models/
├── user.go
├── user_fields.go      ← 自动生成
├── order.go
└── order_fields.go     ← 自动生成
生成代码示例
// user_fields.go(自动生成)
var UserF = struct {
    ID        string
    Name      string
    CreatedAt string
}{
    ID:        "id",            // 映射 json tag "id"
    Name:      "name",          // 映射 json tag "name"
    CreatedAt: "createdAt",     // 映射 json tag "createdAt"
}
使用效果
import "myproject/models"

// 之前(容易拼错)
mworm.SELECT(user).Where(mworm.And("createdAt", "name"))

// 之后(类型安全,IDE 自动补全,且保证使用的是 json tag)
mworm.SELECT(user).Where(mworm.And(models.UserF.CreatedAt, models.UserF.Name))

注意:只为实现了 TableName() 方法的结构体生成字段常量。

API 速查表

功能 API 示例
插入 INSERT(entity).Exec() INSERT(user).Exec()
批量插入 BulkInsert(slice).Exec() BulkInsert(rows).Upsert("id").Exec()
COPY 批量导入 CopyFrom(slice).Exec() CopyFrom(ticks).ExcludeFields("id").Exec()
查询单条 SELECT(entity).Where(...).One(&dest) SELECT(User{}).Where(Eq("id",1)).One(&u)
查询多条 SELECT(entity).Where(...).Many(&dest) SELECT(User{}).Where(Gt("age",18)).Many(&users)
更新 UPDATE(entity).Where(...).Exec() UPDATE(user).WherePK().Exec()
删除 DELETE(entity).Where(...).Exec() DELETE(user).WherePK().Exec()
主键条件 WherePK() 自动构建单/复合主键 WHERE 条件,且在 UPDATE 时自动排除主键字段
等于 Eq(tag, value) Eq("status", 1) (必须使用 json tag)
不等于 NEq(tag, value) NEq("status", 0) (必须使用 json tag)
大于/大于等于 Gt(tag, value) / Gte(tag, value) Gt("age", 18) (必须使用 json tag)
小于/小于等于 Lt(tag, value) / Lte(tag, value) Lt("age", 60) (必须使用 json tag)
IN IN(tag, values...) IN("id", 1, 2, 3) (必须使用 json tag)
NOT IN NotIN(tag, values...) NotIN("status", 4, 5) (必须使用 json tag)
BETWEEN Between(tag, min, max) Between("age", 18, 60) (必须使用 json tag)
LIKE Like(tag...) Like("name") (必须使用 json tag)
ILIKE ILike(tag...) ILike("name") (必须使用 json tag)
IS NULL Null(tag...) Null("email") (必须使用 json tag)
IS NOT NULL NEqNull(tag...) NEqNull("email") (必须使用 json tag)
OR 分组 OrGroup(cgs...) OrGroup(Eq("a",1), Eq("b",2))
AND 分组 AndGroup(cgs...) AndGroup(Gte("a",1), Lte("b",10))
EXISTS Exists(sql, args...) Exists("SELECT 1 FROM ...")
NOT EXISTS NotExists(sql, args...) NotExists("SELECT 1 FROM ...")
子查询 SubQuery(tag, symbol, sql, args...) SubQuery("id", "IN", "SELECT ...") (必须使用 json tag)
JSONB 包含 JsonbContains(tag, value) JsonbContains("data", "{\"a\":1}") (必须使用 json tag)
数组匹配 ArrayAny(tag, value) ArrayAny("tags", "go") (必须使用 json tag)
聚合-计数 Count(column) Count("*")
聚合-求和 Sum(column) Sum("score") (必须使用 json tag)
聚合-平均 Avg(column) Avg("age") (必须使用 json tag)
聚合-最小 Min(column) Min("score") (必须使用 json tag)
聚合-最大 Max(column) Max("score") (必须使用 json tag)
Upsert (全自动) Upsert(conflictTags...) INSERT(u).Upsert("id") (必须使用 json tag)
Upsert (手动) OnConflict(tags...).DoUpdate(tags...) INSERT(u).OnConflict("id").DoUpdate("name") (必须使用 json tag)
更新表达式 SetExpression(tag, expr) SetExpression("age", "age + 1") (必须使用 json tag)
更新空值 AllowEmpty(tags...) AllowEmpty("name") (必须使用 json tag)
动态表名 Table(tableName) Table("users_2026")
条件分支 If(func(o *OrmModel)) .If(func(o *mworm.OrmModel){ o.Limit(10) })
JSONB 映射(Map) JsonbMap(&dest, keys...) SELECT(User{}).JsonbMap(&m, "id", "name")
JSONB 映射(List) JsonbList(&dest) SELECT(User{}).JsonbList(&list)
分页 PAGE(entity, page, size, excludes, cgs...) PAGE(User{}, 1, 10, nil)
链式分页 Paginate(selectBuilder, page, size, &dest) Paginate(SELECT(User{}).Where(...).Desc("id"), 1, 10, &list)
排序 Asc(tag...) / Desc(tag...) Asc("id").Desc("createdAt") (必须使用 json tag)
上下文 WithContext(ctx) SELECT(User{}).WithContext(ctx).One(&u)
事务绑定 Tx(tx) INSERT(order).Tx(tx).Exec()
托管事务 Transaction(ctx, fn) mworm.Transaction(ctx, func(tx *sqlx.Tx) error { ... })
独立客户端 New(db) client := mworm.New(slaveDB); client.SELECT(...)
忽略 0 行 IgnoreZeroRows() UPDATE(user).WherePK().IgnoreZeroRows().Exec()
原生 SQL Raw(express, args...) Raw("age > $1", 18)
原生查询 RawSQL(sql, args...) RawSQL("SELECT ... WHERE id = $1", id).One(&u)
行级锁 ForUpdate(mode...) SELECT(Order{}).Tx(tx).WherePK().ForUpdate().One(&o)
事务选项 TransactionWithOptions(ctx, opts, fn) &sql.TxOptions{Isolation: sql.LevelSerializable}
全表放行 AllowFullTable() DELETE(TmpLog{}).AllowFullTable().Exec()

进阶高级特性

1. 上下文与超时熔断 (WithContext)

支持传入 context.Context,在请求超时或客户端取消连接时,立即中断数据库执行,防止慢查询占满连接池:

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

var user User
err := mworm.SELECT(User{}).
    WithContext(ctx).
    Where(mworm.Eq("id", 123)).
    One(&user)
2. 链式事务与托管闭包 (Transactions)

支持两种事务使用方式:

方式 A:托管式事务闭包(推荐)

自动管理 Begin、Commit 并在发生 error 或 panic 时自动 Rollback:

err := mworm.Transaction(ctx, func(tx *sqlx.Tx) error {
    // 事务内直接链式调用 .Tx(tx)
    if err := mworm.INSERT(order).Tx(tx).Exec(); err != nil {
        return err
    }
    return mworm.UPDATE(account).Tx(tx).Where(mworm.Eq("id", 1)).Exec()
})
指定隔离级别 / 只读事务 + 行级锁
err := mworm.TransactionWithOptions(ctx, &sql.TxOptions{Isolation: sql.LevelRepeatableRead}, func(tx *sqlx.Tx) error {
    var o Order
    // SELECT ... FOR UPDATE;任务抢占场景可用 ForUpdate("SKIP LOCKED"),不等待用 ForUpdate("NOWAIT")
    if err := mworm.SELECT(Order{ID: id}).Tx(tx).WherePK().ForUpdate().One(&o); err != nil {
        return err
    }
    return mworm.UPDATE(Order{ID: id, Status: 2}).Tx(tx).WherePK().Exec()
})
嵌套事务与 SAVEPOINT 保存点(全链路 Context 透明自动传播)

当外部业务层已处于事务中,而调用的公共 Service 内部再次声明了事务时,底层通过 Context 自动检测并转换为 PostgreSQL 原生保存点(SAVEPOINT):

  • 内层逻辑报错或 panic 时,自动局部回滚当前保存点(ROLLBACK TO SAVEPOINT),绝不破坏外层主事务;
  • 推荐使用 TransactionCtx,闭包直接接收携带当前事务的 ctx,调用下游方法时传该 ctx 即可全链路透明继承,下游 .WithContext(ctx) 自动提取执行,彻底告别手动 WithTx!
// 优雅范式:使用 TransactionCtx 实现零摩擦上下文传播
err := mworm.TransactionCtx(ctx, func(ctx context.Context, tx *sqlx.Tx) error {
    // 1. 本层写操作直接使用 tx 或携带 ctx
    if err := mworm.INSERT(order).Tx(tx).Exec(); err != nil {
        return err
    }

    // 2. 调用下游子模块(子模块签名通常只接收 ctx)
    // 此时 ctx 内部已注入当前事务,下游内部无论执行 SELECT(...).WithContext(ctx)
    // 还是再次调用 TransactionCtx(ctx, ...),均能自动继承事务或嵌套为原生 SAVEPOINT 保存点!
    if err := subService.ProcessPayment(ctx); err != nil {
        log.Warn().Err(err).Msg("内层支付操作已局部回滚到保存点,执行业务降级")
    }
    return nil // 外层正常全量提交
})
方式 B:手动绑定外部事务
tx, _ := mworm.SqlxDB.Beginx()
defer tx.Rollback()

err := mworm.BulkInsert(items).Tx(tx).Exec()
if err != nil {
    return err
}
tx.Commit()
3. 多数据库实例与读写分离 (Client)

除全局单例 mworm.SqlxDB 外,支持独立客户端模式:

// 创建独立客户端实例
slaveClient := mworm.New(slaveDB)

// 针对从库查询
var users []User
err := slaveClient.SELECT(User{}).Where(mworm.Eq("status", 1)).Many(&users)

[!NOTE] 执行器优先级与读写一致性契约 当在 TransactionCtx 事务闭包内部时,上下文中注入的活跃事务拥有最高执行优先级(o.tx -> ctx 事务 -> WithDB -> 全局 DB),确保事务内数据读写强一致(Read-Your-Own-Writes);若确需在事务期间绕过当前事务强制走只读从库,请传入不含事务标记的独立上下文(如 context.Background())。

4. 优雅链式分页 (Paginate)

原生链式分页能够天然继承 Where、Desc、Asc、WithContext、Tx 等所有设置:

var userList []User
res, err := mworm.Paginate(
    mworm.SELECT(User{}).
        Where(mworm.Eq("status", 1)).
        Desc("createdAt").
        WithContext(ctx),
    1, 20, &userList,
)
if err != nil {
    return err
}

fmt.Printf("总数: %d, 总页数: %d, 是否有下一页: %v\n", res.Total, res.TotalPage, res.HasNext())
5. 影响行数控制与哨兵错误

对于 UPDATE/DELETE 操作,如果影响行数为 0,mworm 默认返回 mworm.ErrNoRowsAffected。可通过 IgnoreZeroRows() 豁免:

// 捕获特定错误
if errors.Is(err, mworm.ErrNoRowsAffected) {
    // 没有任何行被修改
}

// 或主动忽略 0 行影响
err := mworm.UPDATE(u).WherePK().IgnoreZeroRows().Exec()
6. 慢查询自动监控、告警与回调钩子

配置全局慢查询阈值,当查询耗时超过阈值时将自动打印 Warn 告警日志,并触发自定义回调捕获调用方位置:

// 设置慢查询告警阈值为 200 毫秒 (设为 0 则不启用)
mworm.SlowQueryThreshold = 200 * time.Millisecond

// 注册慢查询告警回调(sqlStr 为参数化 SQL,不含参数值,避免手机号/Token 等敏感数据写入日志)
mworm.OnSlowQuery = func(action string, cost time.Duration, sqlStr string, caller string) {
    log.Printf("[SLOW SQL] 耗时: %v | 调用来源: %s | 动作: %s | SQL: %s", cost, caller, action, sqlStr)
}
7. 数据库连接池状态监控 (Stats)
stats := mworm.Stats()
if stats != nil {
    fmt.Printf("连接池指标: 打开连接=%d, 正在使用=%d, 空闲=%d, 等待数=%d\n",
        stats.OpenConnections, stats.InUse, stats.Idle, stats.WaitCount)
}
8. 复合主键防全表误更/误删安全保护 (WherePK)

当调用 WherePK() 时,mworm 强制执行防呆安全拦截:任一主键字段为空值即返回错误,绝不生成无条件 SQL。 此外,任何最终没有 WHERE 条件的 UPDATE/DELETE(例如 AndAuto 条件全部为空被移除)都会在执行前返回 ErrFullTableOperation,确需全表操作时使用 AllowFullTable() 显式放行。

9. PostgreSQL 原生特性高能运算套件

彻底剔除多数据库兼容的历史妥协,专注于发挥 PostgreSQL 的最强威力:

A. JSONB 原生运算套件
  • JsonContains(tag, value):PostgreSQL 原生包含运算 (column @> ?),支持结构体、Map、切片或 JSON 字符串自动序列化;
  • JsonContainedBy(tag, value):被包含运算 (column <@ ?);
  • JsonbHasKey(tag, key):顶层键存在性检测 (jsonb_exists(column, ?),避开 ? 操作符与参数占位符冲突,完美适配 GIN 索引);
  • JsonbHasAnyKeys(tag, keys):检测是否包含任意一个键 (jsonb_exists_any(column, ?));
  • JsonbHasAllKeys(tag, keys):检测是否同时包含所有键 (jsonb_exists_all(column, ?));
  • JsonPath(tag, path, op, val):路径提取查询 (column#>>'{path}' op ?)。
// 查询 payload 中包含指定权限配置的记录
err := mworm.SELECT(MarketHistory{}).
    Where(mworm.JsonContains("payload", map[string]any{"level": "gold"})).
    Many(&list)

// 查询 payload 中包含指定顶层键的记录
err := mworm.SELECT(MarketHistory{}).
    Where(mworm.JsonbHasKey("payload", "user_id")).
    Many(&list)
B. PostgreSQL 原生数组 (Array) 运算套件
  • ArrayContains(tag, val):数组包含运算 (column @> ?);
  • ArrayOverlaps(tag, val):数组重叠相交运算 (column && ?),极度适合股票概念池、标签集合筛选;
  • ArrayAny(tag, val):标量值存在于数组字段中 (? = ANY(column));
  • AnyEquals(tag, slice):某列等于参数切片中的任一元素 (column = ANY(?)),PostgreSQL 官方推荐的极致单参数替代 IN (?) 方案。
// 标签重叠筛选
err := mworm.SELECT(Stock{}).
    Where(mworm.ArrayOverlaps("tags", []string{"芯片", "半导体"})).
    Many(&stocks)

// 高效单参数替代 IN 查询
err := mworm.SELECT(User{}).
    Where(mworm.AnyEquals("id", []int64{101, 102, 103})).
    Many(&users)
C. 原生大小写不敏感匹配 (ILIKE)
  • ILike(tag, "%keyword%"):原生生成 column ILIKE ?,告别 LOWER() 造成的无法利用 B-Tree 索引问题;
  • 亦兼容结构体取值:mworm.SELECT(User{Name: "alice"}).Where(mworm.ILike("name"))。
err := mworm.SELECT(Stock{}).
    Where(mworm.ILike("name", "%茅台%")).
    Many(&stocks)
10. 编译期强类型 Fluent Builder (Typestate 设计)

为了从根本上消除动词错配与调用混淆,mworm 引入了基于 Typestate(状态机类型模式) 的强类型 Fluent Builder 架构。全局 SELECT/INSERT/BulkInsert/UPDATE/DELETE(以及 client.* 和 mworm.Table(...).*)统一返回正交物理隔离的专属构建器:

构建器类型 专职动词 专属方法子集 (IDE 补全仅可见此类) 严禁方法 (调用即编译报错)
*SelectBuilder 查询 (SELECT) Where, WhereIf, WherePK, Fields, ExcludeFields, Asc, Desc, Limit, Offset, Join, GroupBy, Having, ForUpdate, WithContext, Tx, One, Many, Pluck, Count, Sum, Avg, Min, Max, Scan, JsonbMap, JsonbList ❌ SetField, SetExpression, Exec, OnConflict, Upsert, DoNothing, AllowFullTable
*InsertBuilder 写入 (INSERT, BulkInsert) Fields, ExcludeFields, AllowEmpty, OnConflict, DoUpdate, DoNothing, Upsert, Chunk, Returning, WithContext, Tx, Exec, Scan, One, Many, IgnoreZeroRows ❌ Where, WhereIf, WherePK, Limit, Offset, Asc, Desc, Join, GroupBy, ForUpdate, SetField
*UpdateBuilder 更新 (UPDATE) SetField, SetExpression, Where, WhereIf, WherePK, AllowEmpty, AllowFullTable, Fields, ExcludeFields, Returning, WithContext, Tx, Exec, Scan, One, Many, IgnoreZeroRows ❌ Limit, Offset, Asc, Desc, Join, GroupBy, Having, ForUpdate, OnConflict, Upsert, Chunk
*DeleteBuilder 删除 (DELETE) Where, WhereIf, WherePK, AllowFullTable, Returning, WithContext, Tx, Exec, Scan, One, Many, IgnoreZeroRows ❌ SetField, SetExpression, Fields, ExcludeFields, Limit, Offset, Asc, Desc, Join, GroupBy, OnConflict
A. 编译期零容忍阻断
// ❌ 错误示范:在 INSERT 上写 WHERE 条件(以往会在运行时静默丢弃)
// 现在:Go 编译器直接报错:type *InsertBuilder has no field or method Where
mworm.INSERT(user).Where(mworm.Eq("id", 1)).Exec()

// ❌ 错误示范:在 SELECT 上调用 SetField 或 Exec
// 现在:Go 编译器直接报错:type *SelectBuilder has no field or method SetField / Exec
mworm.SELECT(user).SetField("status", 1).Exec()
B. 零额外内存分配 (Zero-Cost Abstraction)

所有强类型 Builder 均采用单一指针字段包装底层 *OrmModel:

type SelectBuilder struct { model *OrmModel }

内部链式转发全部为短方法,在 Go 编译器激进内联(Aggressive Inlining)下,编译产物直接内联展开为底层调用,零额外堆内存分配,零性能损耗。

C. .Model() 逃生舱与生态兼容

需要直接访问或传递底层 *OrmModel(如存量批处理、动态中间件组装)时,所有 Builder 均提供了 .Model() 方法无感转换:

// 转换为 *OrmModel
orm := mworm.SELECT(User{}).Where(mworm.Eq("status", 1)).Model()

// 链式分页 Paginate 仅接收 *SelectBuilder,传入 INSERT/UPDATE/DELETE 构建器在编译期即报错
pr, err := mworm.Paginate(mworm.SELECT(User{}).Where(mworm.Gt("age", 18)), 1, 10, &users)
D. 动态链式条件装配语法糖 (WhereIf & IfWhen)

在构建动态筛选接口时,以往常需拆分临时变量写大量 if ... { orm.Where(...) }。mworm 提供了 WhereIf 与 IfWhen 语法糖,让整条调用链一气呵成:

  • WhereIf(cond bool, cgs...):当 cond == true 时动态追加 WHERE 条件,否则忽略;
  • IfWhen(cond bool, fn func(b *Builder)):当 cond == true 时执行回调,用于动态微调排序、分页、投影等属性。
// 一行代码流式闭环复杂的动态多条件查询:
err := mworm.SELECT(User{}).
    Where(mworm.Eq("status", 1)).
    WhereIf(req.Keyword != "", mworm.ILike("name", "%"+req.Keyword+"%")).
    WhereIf(req.MinAge > 0, mworm.Gte("age", req.MinAge)).
    IfWhen(req.SortByAge, func(b *mworm.SelectBuilder) {
        b.Desc("age")
    }).
    IfWhen(req.Limit > 0, func(b *mworm.SelectBuilder) {
        b.Limit(req.Limit)
    }).
    Many(&userList)

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// SqlxDB 数据库连接对象
	SqlxDB *sqlx.DB
	// TagName 结构体 tag 名称
	TagName   = "db"
	DebugMode bool

	// ErrNoRowsAffected 影响行数为 0 的哨兵错误
	ErrNoRowsAffected = errors.New("影响行数为0")
	// ErrFullTableOperation UPDATE/DELETE 最终没有任何 WHERE 条件时的拦截错误(防止条件被自动移除后误改/误删全表)
	// 确需全表操作时请显式调用 AllowFullTable()
	ErrFullTableOperation = errors.New("mworm: UPDATE/DELETE 缺少 WHERE 条件,已拦截全表操作")
	// SlowQueryThreshold 慢查询告警阈值,为 0 时不启用。例如可设置为 200 * time.Millisecond
	SlowQueryThreshold time.Duration
	// OnSlowQuery 慢查询触发时的回调函数。入参包括操作动作 (如 "Exec", "Many")、执行耗时、参数化 SQL(不含参数值,避免敏感数据落入日志)、外层调用代码位置
	OnSlowQuery func(action string, cost time.Duration, sqlStr string, caller string)
)
View Source
var (
	ErrInvalidPageSize = &Error{Code: 1001, Message: "page size must be greater than zero"}
	ErrNilDB           = &Error{Code: 1002, Message: "database connection is nil"}
	ErrEmptySQL        = &Error{Code: 1003, Message: "SQL statement is empty"}
	ErrNoEffect        = &Error{Code: 1004, Message: "no rows affected"}
)

定义常见错误

Functions

func Batch

func Batch(ormArray ...*OrmModel) error

Batch 批量插入/更新

func BatchArray

func BatchArray(ormArray []*OrmModel) error

BatchArray 批量插入/更新

func BatchFunc

func BatchFunc(f func(tx *sqlx.Tx) error) error

BatchFunc 批量操作,函数返回 error 时自动回滚

func BindDB

func BindDB(DB *sqlx.DB) error

BindDB 绑定数据库

func ConvertArray added in v0.1.6

func ConvertArray[T int | string](array []T) []string

func Exec added in v0.3.8

func Exec(sqlStr string) error

Exec 执行带命名参数的 SQL 语句

func ExecRawSQL added in v0.2.0

func ExecRawSQL(sql string, args ...any) error

ExecRawSQL 执行原生 SQL,支持 ? 或 $N 占位符参数绑定

func JsonTagToJsonbKeys added in v0.3.7

func JsonTagToJsonbKeys(obj interface{}, prefix string, igTags ...string) string

func JsonbBuildObjString added in v0.2.8

func JsonbBuildObjString(obj interface{}, prefix ...string) string

func Query added in v0.1.4

func Query(query string, dest any) error

func Stats added in v0.4.7

func Stats() *dbsql.DBStats

Stats 获取底层数据库连接池的实时统计信息 (包括 OpenConnections, InUse, Idle, WaitCount 等)

func StructToMap

func StructToMap(item any) (map[string]any, map[string]string)

func Transaction added in v0.4.5

func Transaction(ctx context.Context, fn func(tx *sqlx.Tx) error) (err error)

Transaction 托管式事务执行器,自动管理 BeginTxx / Commit / Rollback (含 panic 保护) 支持上下文嵌套事务:当检测到 ctx 中已处于活跃事务中时,自动创建 PostgreSQL 原生 SAVEPOINT 保存点, 内层出错时局部回滚保存点,外层提交时全量提交。

func TransactionCtx added in v0.5.2

func TransactionCtx(ctx context.Context, fn func(ctx context.Context, tx *sqlx.Tx) error) (err error)

TransactionCtx 带 Context 上下文自动传播的托管式事务执行器 闭包函数直接接收已注入活跃事务的 ctx,下游业务调用 WithContext(ctx) 或内层再次调用 TransactionCtx(ctx, ...) 均可 100% 自动继承当前事务或保存点,实现全链路透明无感事务传播。

func TransactionWithOptions added in v0.5.2

func TransactionWithOptions(ctx context.Context, opts *dbsql.TxOptions, fn func(tx *sqlx.Tx) error) (err error)

TransactionWithOptions 指定隔离级别 / 只读等选项的托管式事务,如 &sql.TxOptions{Isolation: sql.LevelSerializable}

func TransactionWithOptionsCtx added in v0.5.2

func TransactionWithOptionsCtx(ctx context.Context, opts *dbsql.TxOptions, fn func(ctx context.Context, tx *sqlx.Tx) error) (err error)

TransactionWithOptionsCtx 指定选项且带 Context 事务自动传播的托管式事务

func TxFromContext added in v0.5.2

func TxFromContext(ctx context.Context) (*sqlx.Tx, bool)

TxFromContext 从 context 中提取当前活跃的事务对象(若存在)

func ValueTypeToStr added in v0.3.3

func ValueTypeToStr(v any) string

func WithTx added in v0.5.2

func WithTx(ctx context.Context, tx *sqlx.Tx) context.Context

WithTx 将当前事务关联至 context 中,供下游查询通过 WithContext 自动传播或用于嵌套事务

Types

type CRUDInterface

type CRUDInterface interface {
	CRUDMode(mode string) string
}

type Client added in v0.4.5

type Client struct {
	// contains filtered or unexported fields
}

Client 独立的 mworm 客户端实例,用于多数据库、读写分离或单元测试隔离

func New added in v0.4.5

func New(db *sqlx.DB) *Client

New 创建独立的 mworm 客户端实例

func (*Client) BulkInsert added in v0.4.5

func (c *Client) BulkInsert(slice any) *InsertBuilder

func (*Client) CopyFrom added in v0.5.2

func (c *Client) CopyFrom(slice any) *CopyBuilder

CopyFrom 使用 PostgreSQL 原生 Binary COPY 协议批量导入切片数据

func (*Client) DELETE added in v0.4.5

func (c *Client) DELETE(i ORMInterface) *DeleteBuilder

func (*Client) INSERT added in v0.4.5

func (c *Client) INSERT(i ORMInterface) *InsertBuilder

func (*Client) RawSQL added in v0.4.5

func (c *Client) RawSQL(sql string, args ...any) *OrmModel

func (*Client) SELECT added in v0.4.5

func (c *Client) SELECT(i ORMInterface, distinct ...bool) *SelectBuilder

func (*Client) Table added in v0.4.5

func (c *Client) Table(name string) *OrmModel

func (*Client) Transaction added in v0.4.5

func (c *Client) Transaction(ctx context.Context, fn func(tx *sqlx.Tx) error) (err error)

func (*Client) TransactionCtx added in v0.5.2

func (c *Client) TransactionCtx(ctx context.Context, fn func(ctx context.Context, tx *sqlx.Tx) error) (err error)

TransactionCtx 带 Context 上下文自动传播的 Client 托管式事务执行器

func (*Client) TransactionWithOptions added in v0.5.2

func (c *Client) TransactionWithOptions(ctx context.Context, opts *dbsql.TxOptions, fn func(tx *sqlx.Tx) error) (err error)

TransactionWithOptions 指定隔离级别 / 只读等选项的托管式事务

func (*Client) TransactionWithOptionsCtx added in v0.5.2

func (c *Client) TransactionWithOptionsCtx(ctx context.Context, opts *dbsql.TxOptions, fn func(ctx context.Context, tx *sqlx.Tx) error) (err error)

TransactionWithOptionsCtx 指定选项且带 Context 事务自动传播的 Client 托管式事务

func (*Client) UPDATE added in v0.4.5

func (c *Client) UPDATE(i ORMInterface) *UpdateBuilder

type ConditionGroup

type ConditionGroup struct {
	Logic    string   // Logic: 逻辑运算符(AND/OR)
	Symbol   string   // Symbol: 比较符号(=, >, < 等)
	JsonTags []string // JsonTags: 参与条件的字段名
	Args     []any    // Args: 参数值
	InArgs   []string // InArgs: IN 查询参数
	Express  string   // Express: 表达式

	SubGroups []ConditionGroup // SubGroups: 子条件分组(用于嵌套 OR/AND)
	// contains filtered or unexported fields
}

ConditionGroup 条件分组结构体,描述 SQL 查询的条件

func And

func And(tag ...string) ConditionGroup

And 构造 AND 非零条件分组

func And2F

func And2F(tag string, arg any) ConditionGroup

And2F 构造 AND 单字段条件分组

func AndAuto added in v0.3.24

func AndAuto(tag ...string) ConditionGroup

AndAuto 构造 AND 值为空时该条件移除

func AndGroup added in v0.4.3

func AndGroup(cgs ...ConditionGroup) ConditionGroup

AndGroup 构造 AND 嵌套分组,如 AndGroup(Gt("a",1), Lt("b",10)) → (a>1 AND b<10)

func AnyEquals added in v0.4.7

func AnyEquals(tag string, slice any) ConditionGroup

AnyEquals 构造 column = ANY(?) 条件,PostgreSQL 官方推荐的高性能替代 IN (?) 方案(单参数绑定)

func ArrayAny added in v0.4.4

func ArrayAny(tag string, arg any) ConditionGroup

ArrayAny 构造 ? = ANY(column) 条件分组,检查指定值是否属于数据库数组字段

func ArrayContains added in v0.4.7

func ArrayContains(tag string, arg any) ConditionGroup

ArrayContains 构造 PostgreSQL 数组包含条件 (column @> ?)

func ArrayOverlap added in v0.4.4

func ArrayOverlap(tag string, arg any) ConditionGroup

ArrayOverlap 构造 PostgreSQL 数组相交重叠条件 (column && ?)

func ArrayOverlaps added in v0.4.7

func ArrayOverlaps(tag string, arg any) ConditionGroup

ArrayOverlaps ArrayOverlap 的别名

func Asc added in v0.3.1

func Asc(tag string) ConditionGroup

Asc 构造升序条件分组

func AutoFill added in v0.3.3

func AutoFill(zero ...bool) ConditionGroup

AutoFill 自动填充条件分组

func Between added in v0.4.3

func Between(tag string, min, max any) ConditionGroup

Between 构造 BETWEEN 范围查询条件分组,如 Between("age", 18, 60) → age BETWEEN 18 AND 60

func Desc added in v0.3.1

func Desc(tag string) ConditionGroup

Desc 构造降序条件分组

func Eq added in v0.3.3

func Eq(tag string, args ...any) ConditionGroup

Eq 构造等于条件分组

func Exists added in v0.4.3

func Exists(sql string, args ...any) ConditionGroup

Exists 构造 EXISTS 子查询条件,sql 为完整的子查询语句

func Exp

func Exp(express string, args ...any) ConditionGroup

Exp 条件表达式 {table_column_field}=:{name}

func Fields added in v0.3.39

func Fields(tag ...string) ConditionGroup

func Gt added in v0.3.3

func Gt(tag string, args ...any) ConditionGroup

Gt 构造大于条件分组

func Gte added in v0.3.3

func Gte(tag string, args ...any) ConditionGroup

Gte 构造大于等于条件分组

func ILike added in v0.4.4

func ILike(tag string, args ...any) ConditionGroup

ILike 构造 PostgreSQL 大小写不敏感模糊匹配条件 (column ILIKE ?) 支持两种用法: 1. 直接指定参数:ILike("name", "%茅台%") 或 ILike("code", "600%") 2. 结构体自动取值:ILike("name"),自动从 Model.Name 中取值并前后添加 "%"

func IN

func IN[T any](tag string, args ...T) ConditionGroup

IN 构造 IN 查询条件分组

func JoinOn added in v0.3.8

func JoinOn(express string) ConditionGroup

JoinOn 创建 JOIN ON 条件 (实际上是 Raw 的别名,为了语义更清晰)

func JsonContainedBy added in v0.4.7

func JsonContainedBy(tag string, jsonValue any) ConditionGroup

JsonContainedBy 构造 PostgreSQL JSONB 被包含条件 (column <@ ?)。

func JsonContains added in v0.4.7

func JsonContains(tag string, jsonValue any) ConditionGroup

JsonContains 构造 PostgreSQL JSONB 包含条件 (column @> ?)。 支持传入 string, []byte, 或结构体/map/切片(非字符串类型将自动序列化为 JSON 字符串)。

func JsonPath added in v0.4.7

func JsonPath(tag string, path string, op string, val any) ConditionGroup

JsonPath 构造 PostgreSQL JSONB 路径查询条件,生成: column#>>'{path}' op ? 例如: JsonPath("payload", "user,id", "=", 1001) 生成: payload#>>'{user,id}' = ?

func JsonbContainedBy added in v0.4.7

func JsonbContainedBy(tag string, arg any) ConditionGroup

JsonbContainedBy 构造 JSONB <@ 条件分组

func JsonbContains added in v0.4.4

func JsonbContains(tag string, arg any) ConditionGroup

JsonbContains 构造 JSONB @> 条件分组

func JsonbHasAllKeys added in v0.4.4

func JsonbHasAllKeys(tag string, keys any) ConditionGroup

JsonbHasAllKeys 构造 PostgreSQL JSONB 存在所有键条件: jsonb_exists_all(column, ?)

func JsonbHasAnyKeys added in v0.4.4

func JsonbHasAnyKeys(tag string, keys any) ConditionGroup

JsonbHasAnyKeys 构造 PostgreSQL JSONB 存在任一键条件: jsonb_exists_any(column, ?)

func JsonbHasKey added in v0.4.4

func JsonbHasKey(tag string, key string) ConditionGroup

JsonbHasKey 构造 PostgreSQL JSONB 存在顶级键条件: jsonb_exists(column, ?)

func Like added in v0.3.1

func Like(tag ...string) ConditionGroup

Like 构造 AND LIKE 条件分组

func LikeOR added in v0.3.3

func LikeOR(tag ...string) ConditionGroup

LikeOR 构造 OR LIKE 条件分组

func Lt added in v0.3.3

func Lt(tag string, args ...any) ConditionGroup

Lt 构造小于条件分组

func Lte added in v0.3.3

func Lte(tag string, args ...any) ConditionGroup

Lte 构造小于等于条件分组

func NEq added in v0.3.25

func NEq(tag string, args ...any) ConditionGroup

NEq 不等于

func NEqLike added in v0.3.25

func NEqLike(tag ...string) ConditionGroup

NEqLike 构造 AND LIKE != 条件分组

func NEqNull added in v0.3.25

func NEqNull(tag ...string) ConditionGroup

NEqNull 不等于空 And

func NotExists added in v0.4.3

func NotExists(sql string, args ...any) ConditionGroup

NotExists 构造 NOT EXISTS 子查询条件

func NotILike added in v0.4.7

func NotILike(tag string, args ...any) ConditionGroup

NotILike 构造 PostgreSQL 大小写不敏感不匹配条件 (column NOT ILIKE ?)

func NotIN added in v0.4.3

func NotIN[T any](tag string, args ...T) ConditionGroup

NotIN 构造 NOT IN 查询条件分组

func Null added in v0.3.25

func Null(tag ...string) ConditionGroup

Null 是否为空 And

func NullOR added in v0.3.25

func NullOR(tag ...string) ConditionGroup

NullOR 是否为空 OR

func Or

func Or(tag ...string) ConditionGroup

Or 构造 OR 非零条件分组

func Or2F

func Or2F(tag string, args ...any) ConditionGroup

Or2F 构造 OR 单字段条件分组

func OrAuto added in v0.3.24

func OrAuto(tag ...string) ConditionGroup

OrAuto 构造 OR 值为空时该条件移除

func OrGroup added in v0.4.3

func OrGroup(cgs ...ConditionGroup) ConditionGroup

OrGroup 构造 OR 嵌套分组,如 OrGroup(Eq("a",1), Eq("b",2)) → (a=1 OR b=2)

func PgOp added in v0.4.4

func PgOp(tag string, op string, args ...any) ConditionGroup

PgOp 构造 PostgreSQL 特定的运算符条件,例如 PgOp("tags", "@>", `["go"]`)

func Raw added in v0.3.15

func Raw(express string, args ...any) ConditionGroup

Raw 条件表达式 column1 = 2 AND column2 = 'abc' 或 column1 = $1 AND column2 = $2

func SubQuery added in v0.4.3

func SubQuery(tag, symbol, sql string, args ...any) ConditionGroup

SubQuery 构造 WHERE 子查询条件,如 SubQuery("id", "IN", "SELECT user_id FROM orders WHERE amount > $1", 100)

func (ConditionGroup) Transform

func (cg ConditionGroup) Transform() string

Transform 转换为 SQL 字符串(未实现)

type ConditionType added in v0.3.1

type ConditionType int // ConditionType 条件类型枚举

type CopyBuilder added in v0.5.2

type CopyBuilder struct {
	// contains filtered or unexported fields
}

CopyBuilder 专职 PostgreSQL 原生 Binary Copy 协议的流式批量入库构建器 利用底层 pgx 原生二进制 Copy 协议,完全绕过 SQL 语法解析器与参数构造开销, 适用于分时、K 线、资金流等大批量纯追加写入;需要冲突更新时请使用 BulkInsert().Upsert()。

func CopyFrom added in v0.5.2

func CopyFrom(slice any) *CopyBuilder

CopyFrom 使用 PostgreSQL 原生 Binary COPY 协议批量导入切片数据 适用于分时、K 线、资金流等大批量纯追加写入;需要冲突更新时请使用 BulkInsert().Upsert()。

func (*CopyBuilder) Error added in v0.5.2

func (b *CopyBuilder) Error() error

Error 获取当前构建器错误

func (*CopyBuilder) ExcludeFields added in v0.5.2

func (b *CopyBuilder) ExcludeFields(jsonTags ...string) *CopyBuilder

ExcludeFields 排除不导入的列(传入 json tag,如自增主键 id)

func (*CopyBuilder) Exec added in v0.5.2

func (b *CopyBuilder) Exec() (int64, error)

Exec 执行流式 Binary Copy 批量入库,返回实际写入行数

func (*CopyBuilder) Fields added in v0.5.2

func (b *CopyBuilder) Fields(jsonTags ...string) *CopyBuilder

Fields 显式指定导入的列(传入 json tag)

func (*CopyBuilder) Table added in v0.5.2

func (b *CopyBuilder) Table(name string) *CopyBuilder

Table 显式指定目标表名(若不指定,自动提取切片元素的 TableName() 或结构体名)

func (*CopyBuilder) Tx added in v0.5.2

func (b *CopyBuilder) Tx(tx *sqlx.Tx) *CopyBuilder

Tx 绑定现有事务(若在事务中,COPY 操作将在同一事务连接中执行,支持回滚与提交)

func (*CopyBuilder) WithContext added in v0.5.2

func (b *CopyBuilder) WithContext(ctx context.Context) *CopyBuilder

WithContext 绑定上下文(支持超时取消与上下文事务自动继承)

func (*CopyBuilder) WithDB added in v0.5.2

func (b *CopyBuilder) WithDB(db *sqlx.DB) *CopyBuilder

WithDB 绑定指定数据库连接池

type DeleteBuilder added in v0.5.2

type DeleteBuilder struct {
	// contains filtered or unexported fields
}

DeleteBuilder 专职 DELETE 删除的强类型构建器

func DELETE

func DELETE(i ORMInterface) *DeleteBuilder

DELETE 删除

func (*DeleteBuilder) AllowFullTable added in v0.5.2

func (b *DeleteBuilder) AllowFullTable() *DeleteBuilder

func (*DeleteBuilder) BuildSQL added in v0.5.2

func (b *DeleteBuilder) BuildSQL() SQLParams

func (*DeleteBuilder) Clone added in v0.5.2

func (b *DeleteBuilder) Clone() *DeleteBuilder

func (*DeleteBuilder) Error added in v0.5.2

func (b *DeleteBuilder) Error() error

func (*DeleteBuilder) Exec added in v0.5.2

func (b *DeleteBuilder) Exec() error

func (*DeleteBuilder) FullSQL added in v0.5.2

func (b *DeleteBuilder) FullSQL() SQLParams

func (*DeleteBuilder) If added in v0.5.2

func (b *DeleteBuilder) If(ifFunc func(b *DeleteBuilder)) *DeleteBuilder

func (*DeleteBuilder) IfWhen added in v0.5.2

func (b *DeleteBuilder) IfWhen(cond bool, fn func(b *DeleteBuilder)) *DeleteBuilder

func (*DeleteBuilder) IgnoreZeroRows added in v0.5.2

func (b *DeleteBuilder) IgnoreZeroRows(ignore ...bool) *DeleteBuilder

func (*DeleteBuilder) Log added in v0.5.2

func (b *DeleteBuilder) Log(l bool) *DeleteBuilder

func (*DeleteBuilder) Many added in v0.5.2

func (b *DeleteBuilder) Many(dest interface{}) error

func (*DeleteBuilder) Model added in v0.5.2

func (b *DeleteBuilder) Model() *OrmModel

func (*DeleteBuilder) One added in v0.5.2

func (b *DeleteBuilder) One(dest interface{}) error

func (*DeleteBuilder) Returning added in v0.5.2

func (b *DeleteBuilder) Returning(cols ...string) *DeleteBuilder

func (*DeleteBuilder) RowsAffected added in v0.5.2

func (b *DeleteBuilder) RowsAffected() int64

func (*DeleteBuilder) Scan added in v0.5.2

func (b *DeleteBuilder) Scan(dest ...interface{}) error

func (*DeleteBuilder) Tx added in v0.5.2

func (b *DeleteBuilder) Tx(tx *sqlx.Tx) *DeleteBuilder

func (*DeleteBuilder) Where added in v0.5.2

func (b *DeleteBuilder) Where(cgs ...ConditionGroup) *DeleteBuilder

func (*DeleteBuilder) WhereIf added in v0.5.2

func (b *DeleteBuilder) WhereIf(cond bool, cgs ...ConditionGroup) *DeleteBuilder

func (*DeleteBuilder) WherePK added in v0.5.2

func (b *DeleteBuilder) WherePK() *DeleteBuilder

func (*DeleteBuilder) WithContext added in v0.5.2

func (b *DeleteBuilder) WithContext(ctx context.Context) *DeleteBuilder

func (*DeleteBuilder) WithDB added in v0.5.2

func (b *DeleteBuilder) WithDB(db *sqlx.DB) *DeleteBuilder

type Error added in v0.3.8

type Error struct {
	Code    int    // 错误码
	Message string // 错误信息
	SQL     string // SQL语句
}

Error 包含了详细的错误信息

func (Error) Error added in v0.3.8

func (e Error) Error() string

type InsertBuilder added in v0.5.2

type InsertBuilder struct {
	// contains filtered or unexported fields
}

InsertBuilder 专职 INSERT 与 BulkInsert 的强类型构建器

func BulkInsert added in v0.4.5

func BulkInsert(slice interface{}) *InsertBuilder

BulkInsert 批量插入,slice 为 []T(T 须实现 ORMInterface) 生成单条 INSERT INTO ... VALUES (...),(...),... SQL,N 行仅 1 次数据库往返 支持链式调用 .Upsert() / .DoNothing() / .OnConflict().DoUpdate() / .Exec() 零值字段:BulkInsert 对所有行全列写入(与单行 INSERT 的零值跳过行为不同) 若需排除某列,请在调用前用 ExcludeFields("jsonTag") 指定

func INSERT

func INSERT(i ORMInterface) *InsertBuilder

INSERT 插入

func (*InsertBuilder) AllowEmpty added in v0.5.2

func (b *InsertBuilder) AllowEmpty(jsonTag ...string) *InsertBuilder

func (*InsertBuilder) BuildSQL added in v0.5.2

func (b *InsertBuilder) BuildSQL() SQLParams

func (*InsertBuilder) Chunk added in v0.5.2

func (b *InsertBuilder) Chunk(size int) *InsertBuilder

func (*InsertBuilder) Clone added in v0.5.2

func (b *InsertBuilder) Clone() *InsertBuilder

func (*InsertBuilder) DoNothing added in v0.5.2

func (b *InsertBuilder) DoNothing() *InsertBuilder

func (*InsertBuilder) DoUpdate added in v0.5.2

func (b *InsertBuilder) DoUpdate(jsonTags ...string) *InsertBuilder

func (*InsertBuilder) Error added in v0.5.2

func (b *InsertBuilder) Error() error

func (*InsertBuilder) ExcludeFields added in v0.5.2

func (b *InsertBuilder) ExcludeFields(jsonTag ...string) *InsertBuilder

func (*InsertBuilder) Exec added in v0.5.2

func (b *InsertBuilder) Exec() error

func (*InsertBuilder) Fields added in v0.5.2

func (b *InsertBuilder) Fields(jsonTag ...string) *InsertBuilder

func (*InsertBuilder) FullSQL added in v0.5.2

func (b *InsertBuilder) FullSQL() SQLParams

func (*InsertBuilder) If added in v0.5.2

func (b *InsertBuilder) If(ifFunc func(b *InsertBuilder)) *InsertBuilder

func (*InsertBuilder) IfWhen added in v0.5.2

func (b *InsertBuilder) IfWhen(cond bool, fn func(b *InsertBuilder)) *InsertBuilder

func (*InsertBuilder) IgnoreZeroRows added in v0.5.2

func (b *InsertBuilder) IgnoreZeroRows(ignore ...bool) *InsertBuilder

func (*InsertBuilder) Log added in v0.5.2

func (b *InsertBuilder) Log(l bool) *InsertBuilder

func (*InsertBuilder) Many added in v0.5.2

func (b *InsertBuilder) Many(dest interface{}) error

func (*InsertBuilder) Model added in v0.5.2

func (b *InsertBuilder) Model() *OrmModel

func (*InsertBuilder) OnConflict added in v0.5.2

func (b *InsertBuilder) OnConflict(jsonTags ...string) *InsertBuilder

func (*InsertBuilder) One added in v0.5.2

func (b *InsertBuilder) One(dest interface{}) error

func (*InsertBuilder) Returning added in v0.5.2

func (b *InsertBuilder) Returning(cols ...string) *InsertBuilder

func (*InsertBuilder) RowsAffected added in v0.5.2

func (b *InsertBuilder) RowsAffected() int64

func (*InsertBuilder) Scan added in v0.5.2

func (b *InsertBuilder) Scan(dest ...interface{}) error

func (*InsertBuilder) Tx added in v0.5.2

func (b *InsertBuilder) Tx(tx *sqlx.Tx) *InsertBuilder

func (*InsertBuilder) Upsert added in v0.5.2

func (b *InsertBuilder) Upsert(conflictJsonTags ...string) *InsertBuilder

func (*InsertBuilder) WithContext added in v0.5.2

func (b *InsertBuilder) WithContext(ctx context.Context) *InsertBuilder

func (*InsertBuilder) WithDB added in v0.5.2

func (b *InsertBuilder) WithDB(db *sqlx.DB) *InsertBuilder

type JoinTable added in v0.3.8

type JoinTable struct {
	Type        JoinType         // JOIN 类型
	Table       string           // 表名
	Alias       string           // 表别名
	Conditions  []ConditionGroup // JOIN 条件
	SelectField []string         // 需要查询的字段
}

JoinTable 连接表的结构

func INNER_JOIN added in v0.4.0

func INNER_JOIN(i ORMInterface, alias string) *JoinTable

INNER_JOIN 通过 ORMInterface 创建 INNER JOIN

func InnerJoin added in v0.3.8

func InnerJoin(table, alias string) *JoinTable

InnerJoin 创建一个 INNER JOIN

func LEFT_JOIN added in v0.4.0

func LEFT_JOIN(i ORMInterface, alias string) *JoinTable

LEFT_JOIN 通过 ORMInterface 创建 LEFT JOIN

func LeftJoin added in v0.3.8

func LeftJoin(table, alias string) *JoinTable

LeftJoin 创建一个 LEFT JOIN

func NewJoin added in v0.4.0

func NewJoin(joinType JoinType, table, alias string) *JoinTable

NewJoin 创建一个新的 JoinTable

func RIGHT_JOIN added in v0.4.0

func RIGHT_JOIN(i ORMInterface, alias string) *JoinTable

RIGHT_JOIN 通过 ORMInterface 创建 RIGHT JOIN

func RightJoin added in v0.3.8

func RightJoin(table, alias string) *JoinTable

RightJoin 创建一个 RIGHT JOIN

func (*JoinTable) On added in v0.4.0

func (j *JoinTable) On(cgs ...ConditionGroup) *JoinTable

On 添加连接条件 推荐使用 mworm.Raw("t.id = a.user_id") 或 mworm.JoinOn("t.id = a.user_id")

func (*JoinTable) Select added in v0.4.0

func (j *JoinTable) Select(fields ...string) *JoinTable

Select 指定该连接表需要查询的字段

type JoinType added in v0.3.8

type JoinType int

JoinType 连接类型

const (
	InnerJoinType JoinType = iota // INNER JOIN
	LeftJoinType                  // LEFT JOIN
	RightJoinType                 // RIGHT JOIN
)

func (JoinType) String added in v0.3.8

func (j JoinType) String() string

String 返回 JOIN 类型的字符串表示

type ORMInterface

type ORMInterface interface {
	TableName() string
}

ORMInterface 数据库表结构体接口,需实现 TableName 方法 CRUDInterface 数据库操作接口,需实现 CRUDMode 方法

type OrmModel

type OrmModel struct {
	// contains filtered or unexported fields
}

func O added in v0.1.4

func O() *OrmModel

func RawSQL

func RawSQL(sql string, args ...any) *OrmModel

RawSQL 原生 SQL 查询/执行,支持 ? 或 $N 占位符参数绑定,如 RawSQL("SELECT * FROM t WHERE id = ?", 1)

func Table

func Table(name string) *OrmModel

Table 指定表名(自动添加 PostgreSQL 规范双引号安全引用)

func (*OrmModel) AllowEmpty added in v0.3.12

func (o *OrmModel) AllowEmpty(jsonTag ...string) *OrmModel

func (*OrmModel) AllowFullTable added in v0.5.2

func (o *OrmModel) AllowFullTable() *OrmModel

AllowFullTable 显式允许无 WHERE 条件的 UPDATE/DELETE(默认拦截并返回 ErrFullTableOperation)

func (*OrmModel) Asc

func (o *OrmModel) Asc(jsonTag ...string) *OrmModel

func (*OrmModel) Avg added in v0.4.3

func (o *OrmModel) Avg(column string) (float64, error)

Avg 平均值

func (*OrmModel) BuildSQL added in v0.3.10

func (o *OrmModel) BuildSQL() SQLParams

BuildSQL 构造带命名参数的 SQL 语句

func (*OrmModel) Chunk added in v0.4.7

func (o *OrmModel) Chunk(size int) *OrmModel

Chunk 设置 BulkInsert 批量插入时的单批行数。 当待插入数据行数超过该值时,自动按批次分段执行,防止触发单条 SQL 绑定参数过多限制(如 PostgreSQL 65535 参数限制)。 若当前未处于事务中,自动开启独立事务执行各批次,保证全量写入的原子性。

func (*OrmModel) Clone added in v0.4.5

func (o *OrmModel) Clone() *OrmModel

Clone 深度克隆当前 OrmModel

func (*OrmModel) Count

func (o *OrmModel) Count(column string) (int64, error)

Count 统计数量,column 支持 "*"、json tag 或列名

func (*OrmModel) Delete

func (o *OrmModel) Delete(i interface{}) *DeleteBuilder

func (*OrmModel) Desc

func (o *OrmModel) Desc(jsonTag ...string) *OrmModel

func (*OrmModel) DoNothing added in v0.4.3

func (o *OrmModel) DoNothing() *OrmModel

DoNothing 冲突时不做任何操作,需先调用 OnConflict

func (*OrmModel) DoUpdate added in v0.4.3

func (o *OrmModel) DoUpdate(jsonTags ...string) *OrmModel

DoUpdate 冲突时更新指定字段(json tag),需先调用 OnConflict

func (*OrmModel) Error

func (o *OrmModel) Error() error

func (*OrmModel) ExcludeFields added in v0.1.17

func (o *OrmModel) ExcludeFields(jsonTag ...string) *OrmModel

func (*OrmModel) Exec

func (o *OrmModel) Exec() error

Exec 执行由 OrmModel 生成的 SQL 查询,并在出现错误时返回错误。

func (*OrmModel) Fields

func (o *OrmModel) Fields(jsonTag ...string) *OrmModel

func (*OrmModel) ForUpdate added in v0.5.2

func (o *OrmModel) ForUpdate(mode ...string) *OrmModel

ForUpdate 为 SELECT 追加行级锁子句(须在事务中配合 .Tx(tx) 使用) mode 可选 "NOWAIT" 或 "SKIP LOCKED"(大小写不敏感),其他取值返回错误

func (*OrmModel) FullSQL added in v0.2.3

func (o *OrmModel) FullSQL() SQLParams

FullSQL SQL+WithSQL

func (*OrmModel) GroupBy added in v0.3.39

func (o *OrmModel) GroupBy(cgs ...ConditionGroup) *OrmModel

GroupBy 分组查询:Fields(...) 指定分组字段,Raw(expr, args...) 追加聚合表达式(支持 $N / ? 参数绑定)

func (*OrmModel) Having added in v0.3.39

func (o *OrmModel) Having(exp string, args ...any) *OrmModel

Having 分组过滤条件,支持 $N / ? 参数绑定,如 Having("count(*) > $1", 2)

func (*OrmModel) If

func (o *OrmModel) If(ifFunc func(o *OrmModel)) *OrmModel

func (*OrmModel) IfWhen added in v0.5.2

func (o *OrmModel) IfWhen(cond bool, fn func(o *OrmModel)) *OrmModel

IfWhen 当 cond 为 true 时执行回调,便于根据条件动态流式组装链式调用

func (*OrmModel) IgnoreZeroRows added in v0.4.5

func (o *OrmModel) IgnoreZeroRows(ignore ...bool) *OrmModel

IgnoreZeroRows 设置当影响行数为 0 时是否忽略错误(不抛出 ErrNoRowsAffected)

func (*OrmModel) Insert

func (o *OrmModel) Insert(i interface{}) *InsertBuilder

func (*OrmModel) Join added in v0.3.8

func (o *OrmModel) Join(join *JoinTable) *OrmModel

Join 添加连接表到 OrmModel

func (*OrmModel) JsonbList

func (o *OrmModel) JsonbList(dest interface{}) error

func (*OrmModel) JsonbListString

func (o *OrmModel) JsonbListString() (string, error)

func (*OrmModel) JsonbMap

func (o *OrmModel) JsonbMap(dest interface{}, columns ...string) error

func (*OrmModel) JsonbMapString

func (o *OrmModel) JsonbMapString(keys ...string) (string, error)

func (*OrmModel) Limit

func (o *OrmModel) Limit(row int64) *OrmModel

func (*OrmModel) Log

func (o *OrmModel) Log(l bool) *OrmModel

func (*OrmModel) Many added in v0.1.18

func (o *OrmModel) Many(dest interface{}) error

Many 查询多条记录,或执行带 RETURNING 的批量操作并将结果映射为切片(结果追加到 dest 末尾)。 任一行扫描/类型绑定失败或遍历中断(rows.Err)都会返回错误,不会静默丢行。

func (*OrmModel) Max added in v0.4.3

func (o *OrmModel) Max(column string) (float64, error)

Max 最大值

func (*OrmModel) Min added in v0.4.3

func (o *OrmModel) Min(column string) (float64, error)

Min 最小值

func (*OrmModel) Offset

func (o *OrmModel) Offset(row int64) *OrmModel

func (*OrmModel) OnConflict added in v0.4.3

func (o *OrmModel) OnConflict(jsonTags ...string) *OrmModel

OnConflict 指定 Upsert 冲突列(json tag),用于 INSERT ON CONFLICT

func (*OrmModel) One added in v0.1.18

func (o *OrmModel) One(dest interface{}) error

One 查询单条记录,或执行带 RETURNING 的 INSERT/UPDATE/DELETE 并将返回行映射到目标结构体。 无记录时返回 sql.ErrNoRows。

func (*OrmModel) Pluck added in v0.5.2

func (o *OrmModel) Pluck(field string, dest interface{}) error

Pluck 查询指定单列并将结果提取为切片(如 &[]string, &[]int64, &[]float64 等)。 自动强制限定 SELECT 仅投影该列,彻底杜绝大宽表 SELECT * 带来的 IO 与无用字段反序列化开销。 字段名支持 json tag 或物理列名。

func (*OrmModel) RETURNING

func (o *OrmModel) RETURNING(single any, list any, jsonTag ...string) error

func (*OrmModel) Returning added in v0.4.7

func (o *OrmModel) Returning(cols ...string) *OrmModel

Returning 指定 PostgreSQL DML (INSERT/UPDATE/DELETE) 操作的 RETURNING 子句。 支持指定字段(json tag 或列名,如 Returning("id", "createdAt")),或不传参/传入 "*" 返回所有列(RETURNING *)。 链式调用后可接 .Scan(&id) 直接提取单列,或 .One(&model) / .Many(&slice) 直接映射为结构体。

func (*OrmModel) RowsAffected added in v0.4.5

func (o *OrmModel) RowsAffected() int64

RowsAffected 返回最近一次 Exec 执行所影响的行数

func (*OrmModel) Scan added in v0.4.7

func (o *OrmModel) Scan(dest ...interface{}) error

Scan 执行当前带 RETURNING 的写操作或自定义查询,并将单行首个或多个指定字段扫描到目标指针变量中(如 &id, &status)

func (*OrmModel) Select

func (o *OrmModel) Select(i interface{}, distinct ...bool) *SelectBuilder

func (*OrmModel) SetExpression added in v0.4.4

func (o *OrmModel) SetExpression(jsonTag string, expr string, args ...any) *OrmModel

SetExpression UPDATE 使用自定义表达式设置字段值,支持 $N / ? 参数绑定 如: SetExpression("score", "score - $1", 38) 或 SetExpression("data", "jsonb_set(data, '{key}', $1)", `"v"`)

func (*OrmModel) SetField added in v0.1.11

func (o *OrmModel) SetField(jsonTag string, arg any) *OrmModel

SetField UPDATE 设置字段值(参数化绑定,支持零值、NULL 与带时区的时间)

func (*OrmModel) Sum added in v0.4.3

func (o *OrmModel) Sum(column string) (float64, error)

Sum 求和

func (*OrmModel) Tx added in v0.4.5

func (o *OrmModel) Tx(tx *sqlx.Tx) *OrmModel

Tx 绑定事务对象,支持在事务上下文中链式执行

func (*OrmModel) Update

func (o *OrmModel) Update(i interface{}) *UpdateBuilder

func (*OrmModel) Upsert added in v0.4.4

func (o *OrmModel) Upsert(conflictJsonTags ...string) *OrmModel

Upsert 极简版的 ON CONFLICT DO UPDATE 指定冲突列(通常是主键或唯一索引的 json tag),自动将其他字段组合为 EXCLUDED.xxx 进行更新。 单行 INSERT 仅更新本次实际写入的列(零值被跳过的列不会被默认值覆盖);BulkInsert 更新所有写入列。

func (*OrmModel) Where

func (o *OrmModel) Where(cgs ...ConditionGroup) *OrmModel

func (*OrmModel) WhereIf added in v0.5.2

func (o *OrmModel) WhereIf(cond bool, cgs ...ConditionGroup) *OrmModel

WhereIf 根据布尔条件判断是否追加查询条件。当 cond 为 true 时追加 cgs,为 false 时直接忽略,支持链式流式组装

func (*OrmModel) WherePK

func (o *OrmModel) WherePK() *OrmModel

WherePK 使用dbTag里包含pk字符的jsonTag的字段进行查询。 db:"columnName,pk" 任一主键值为空(零值/空串)即返回 ErrFullTableOperation,防止复合主键退化为残缺 WHERE 误操作多行

func (*OrmModel) With

func (o *OrmModel) With(t string) *OrmModel

With 关联查询

func (*OrmModel) WithAsc

func (o *OrmModel) WithAsc(fields ...string) *OrmModel

func (*OrmModel) WithContext added in v0.4.5

func (o *OrmModel) WithContext(ctx context.Context) *OrmModel

WithContext 关联上下文,支持超时取消与跨服务链路传递

func (*OrmModel) WithDB added in v0.4.5

func (o *OrmModel) WithDB(db *sqlx.DB) *OrmModel

WithDB 绑定指定数据库连接,支持多库与读写分离

func (*OrmModel) WithDesc

func (o *OrmModel) WithDesc(fields ...string) *OrmModel

type PageResult added in v0.3.1

type PageResult[T any] struct {
	Total     int `json:"total" db:"total"`          //总记录数
	TotalPage int `json:"totalPage" db:"total_page"` //总页数
	Page      int `json:"page" db:"page"`            //当前页
	PageSize  int `json:"pageSize" db:"page_size"`   //页面数量
	List      []T `json:"list" db:"list"`            //分页数据
}

PageResult 用于分页查询结果的结构体,包含总数、总页数、当前页、每页数量和数据列表。

func DebugPAGE added in v0.3.3

func DebugPAGE[T ORMInterface](entity T, debug bool, page, pageSize int, excludeTags []string, cgs ...ConditionGroup) (PageResult[T], error)

DebugPAGE 分页查询方法,支持调试和排除指定的json tag字段

func PAGE added in v0.3.1

func PAGE[T ORMInterface](entity T, page, pageSize int, excludeTags []string, cgs ...ConditionGroup) (PageResult[T], error)

PAGE 分页查询方法,支持排除指定的json tag字段

func Paginate added in v0.4.5

func Paginate[T any](q *SelectBuilder, page, pageSize int, dest *[]T) (PageResult[T], error)

Paginate 基于 SELECT 构建器执行分页查询(仅接收 *SelectBuilder,非查询动词在编译期即被拒绝) 天然继承并复用 Where, Asc, Desc, WithContext, Tx, WithDB, ExcludeFields 等所有设置

func (PageResult[T]) CalcTotalPage added in v0.3.1

func (pr PageResult[T]) CalcTotalPage() int

CalcTotalPage 计算总页数

func (PageResult[T]) HasNext added in v0.4.5

func (pr PageResult[T]) HasNext() bool

HasNext 是否有下一页

func (PageResult[T]) HasPrev added in v0.4.5

func (pr PageResult[T]) HasPrev() bool

HasPrev 是否有上一页

type SQLParams added in v0.3.11

type SQLParams struct {
	Sql     string // 含占位符 ? 的 SQL(配合 Args 使用)
	WithSql string
	Params  map[string]interface{}
	Args    []any
	Err     error
}

func (SQLParams) ExeSql added in v0.4.1

func (sp SQLParams) ExeSql() string

func (SQLParams) TxExec added in v0.4.1

func (sp SQLParams) TxExec(tx *sqlx.Tx) (dbsql.Result, error)

TxExec 在事务中执行;若 SQL 构建阶段已产生错误(如写操作条件为空被拦截),直接返回错误,绝不执行

func (SQLParams) TxMustExec added in v0.4.1

func (sp SQLParams) TxMustExec(tx *sqlx.Tx) dbsql.Result

TxMustExec 在事务中执行,出错时 panic(与 sqlx.MustExec 语义一致);构建期错误同样 panic,绝不执行

type SelectBuilder added in v0.5.2

type SelectBuilder struct {
	// contains filtered or unexported fields
}

SelectBuilder 专职 SELECT 查询的强类型构建器

func SELECT

func SELECT(i ORMInterface, distinct ...bool) *SelectBuilder

SELECT 查询

func (*SelectBuilder) Asc added in v0.5.2

func (b *SelectBuilder) Asc(jsonTag ...string) *SelectBuilder

func (*SelectBuilder) Avg added in v0.5.2

func (b *SelectBuilder) Avg(column string) (float64, error)

func (*SelectBuilder) BuildSQL added in v0.5.2

func (b *SelectBuilder) BuildSQL() SQLParams

func (*SelectBuilder) Clone added in v0.5.2

func (b *SelectBuilder) Clone() *SelectBuilder

func (*SelectBuilder) Count added in v0.5.2

func (b *SelectBuilder) Count(column string) (int64, error)

func (*SelectBuilder) Desc added in v0.5.2

func (b *SelectBuilder) Desc(jsonTag ...string) *SelectBuilder

func (*SelectBuilder) Error added in v0.5.2

func (b *SelectBuilder) Error() error

func (*SelectBuilder) ExcludeFields added in v0.5.2

func (b *SelectBuilder) ExcludeFields(jsonTag ...string) *SelectBuilder

func (*SelectBuilder) Fields added in v0.5.2

func (b *SelectBuilder) Fields(jsonTag ...string) *SelectBuilder

func (*SelectBuilder) ForUpdate added in v0.5.2

func (b *SelectBuilder) ForUpdate(mode ...string) *SelectBuilder

func (*SelectBuilder) FullSQL added in v0.5.2

func (b *SelectBuilder) FullSQL() SQLParams

func (*SelectBuilder) GroupBy added in v0.5.2

func (b *SelectBuilder) GroupBy(cgs ...ConditionGroup) *SelectBuilder

func (*SelectBuilder) Having added in v0.5.2

func (b *SelectBuilder) Having(exp string, args ...any) *SelectBuilder

func (*SelectBuilder) If added in v0.5.2

func (b *SelectBuilder) If(ifFunc func(b *SelectBuilder)) *SelectBuilder

func (*SelectBuilder) IfWhen added in v0.5.2

func (b *SelectBuilder) IfWhen(cond bool, fn func(b *SelectBuilder)) *SelectBuilder

func (*SelectBuilder) Join added in v0.5.2

func (b *SelectBuilder) Join(join *JoinTable) *SelectBuilder

func (*SelectBuilder) JsonbList added in v0.5.2

func (b *SelectBuilder) JsonbList(dest interface{}) error

func (*SelectBuilder) JsonbListString added in v0.5.2

func (b *SelectBuilder) JsonbListString() (string, error)

func (*SelectBuilder) JsonbMap added in v0.5.2

func (b *SelectBuilder) JsonbMap(dest interface{}, columns ...string) error

func (*SelectBuilder) JsonbMapString added in v0.5.2

func (b *SelectBuilder) JsonbMapString(keys ...string) (string, error)

func (*SelectBuilder) Limit added in v0.5.2

func (b *SelectBuilder) Limit(row int64) *SelectBuilder

func (*SelectBuilder) Log added in v0.5.2

func (b *SelectBuilder) Log(l bool) *SelectBuilder

func (*SelectBuilder) Many added in v0.5.2

func (b *SelectBuilder) Many(dest interface{}) error

func (*SelectBuilder) Max added in v0.5.2

func (b *SelectBuilder) Max(column string) (float64, error)

func (*SelectBuilder) Min added in v0.5.2

func (b *SelectBuilder) Min(column string) (float64, error)

func (*SelectBuilder) Model added in v0.5.2

func (b *SelectBuilder) Model() *OrmModel

func (*SelectBuilder) Offset added in v0.5.2

func (b *SelectBuilder) Offset(row int64) *SelectBuilder

func (*SelectBuilder) One added in v0.5.2

func (b *SelectBuilder) One(dest interface{}) error

func (*SelectBuilder) Pluck added in v0.5.2

func (b *SelectBuilder) Pluck(field string, dest interface{}) error

func (*SelectBuilder) Scan added in v0.5.2

func (b *SelectBuilder) Scan(dest ...interface{}) error

func (*SelectBuilder) Sum added in v0.5.2

func (b *SelectBuilder) Sum(column string) (float64, error)

func (*SelectBuilder) Tx added in v0.5.2

func (b *SelectBuilder) Tx(tx *sqlx.Tx) *SelectBuilder

func (*SelectBuilder) Where added in v0.5.2

func (b *SelectBuilder) Where(cgs ...ConditionGroup) *SelectBuilder

func (*SelectBuilder) WhereIf added in v0.5.2

func (b *SelectBuilder) WhereIf(cond bool, cgs ...ConditionGroup) *SelectBuilder

func (*SelectBuilder) WherePK added in v0.5.2

func (b *SelectBuilder) WherePK() *SelectBuilder

func (*SelectBuilder) With added in v0.5.2

func (b *SelectBuilder) With(t string) *SelectBuilder

func (*SelectBuilder) WithAsc added in v0.5.2

func (b *SelectBuilder) WithAsc(fields ...string) *SelectBuilder

func (*SelectBuilder) WithContext added in v0.5.2

func (b *SelectBuilder) WithContext(ctx context.Context) *SelectBuilder

func (*SelectBuilder) WithDB added in v0.5.2

func (b *SelectBuilder) WithDB(db *sqlx.DB) *SelectBuilder

func (*SelectBuilder) WithDesc added in v0.5.2

func (b *SelectBuilder) WithDesc(fields ...string) *SelectBuilder

type UpdateBuilder added in v0.5.2

type UpdateBuilder struct {
	// contains filtered or unexported fields
}

UpdateBuilder 专职 UPDATE 更新的强类型构建器

func UPDATE

func UPDATE(i ORMInterface) *UpdateBuilder

UPDATE 更新

func (*UpdateBuilder) AllowEmpty added in v0.5.2

func (b *UpdateBuilder) AllowEmpty(jsonTag ...string) *UpdateBuilder

func (*UpdateBuilder) AllowFullTable added in v0.5.2

func (b *UpdateBuilder) AllowFullTable() *UpdateBuilder

func (*UpdateBuilder) BuildSQL added in v0.5.2

func (b *UpdateBuilder) BuildSQL() SQLParams

func (*UpdateBuilder) Clone added in v0.5.2

func (b *UpdateBuilder) Clone() *UpdateBuilder

func (*UpdateBuilder) Error added in v0.5.2

func (b *UpdateBuilder) Error() error

func (*UpdateBuilder) ExcludeFields added in v0.5.2

func (b *UpdateBuilder) ExcludeFields(jsonTag ...string) *UpdateBuilder

func (*UpdateBuilder) Exec added in v0.5.2

func (b *UpdateBuilder) Exec() error

func (*UpdateBuilder) Fields added in v0.5.2

func (b *UpdateBuilder) Fields(jsonTag ...string) *UpdateBuilder

func (*UpdateBuilder) FullSQL added in v0.5.2

func (b *UpdateBuilder) FullSQL() SQLParams

func (*UpdateBuilder) If added in v0.5.2

func (b *UpdateBuilder) If(ifFunc func(b *UpdateBuilder)) *UpdateBuilder

func (*UpdateBuilder) IfWhen added in v0.5.2

func (b *UpdateBuilder) IfWhen(cond bool, fn func(b *UpdateBuilder)) *UpdateBuilder

func (*UpdateBuilder) IgnoreZeroRows added in v0.5.2

func (b *UpdateBuilder) IgnoreZeroRows(ignore ...bool) *UpdateBuilder

func (*UpdateBuilder) Log added in v0.5.2

func (b *UpdateBuilder) Log(l bool) *UpdateBuilder

func (*UpdateBuilder) Many added in v0.5.2

func (b *UpdateBuilder) Many(dest interface{}) error

func (*UpdateBuilder) Model added in v0.5.2

func (b *UpdateBuilder) Model() *OrmModel

func (*UpdateBuilder) One added in v0.5.2

func (b *UpdateBuilder) One(dest interface{}) error

func (*UpdateBuilder) Returning added in v0.5.2

func (b *UpdateBuilder) Returning(cols ...string) *UpdateBuilder

func (*UpdateBuilder) RowsAffected added in v0.5.2

func (b *UpdateBuilder) RowsAffected() int64

func (*UpdateBuilder) Scan added in v0.5.2

func (b *UpdateBuilder) Scan(dest ...interface{}) error

func (*UpdateBuilder) SetExpression added in v0.5.2

func (b *UpdateBuilder) SetExpression(jsonTag string, expr string, args ...any) *UpdateBuilder

func (*UpdateBuilder) SetField added in v0.5.2

func (b *UpdateBuilder) SetField(jsonTag string, arg any) *UpdateBuilder

func (*UpdateBuilder) Tx added in v0.5.2

func (b *UpdateBuilder) Tx(tx *sqlx.Tx) *UpdateBuilder

func (*UpdateBuilder) Where added in v0.5.2

func (b *UpdateBuilder) Where(cgs ...ConditionGroup) *UpdateBuilder

func (*UpdateBuilder) WhereIf added in v0.5.2

func (b *UpdateBuilder) WhereIf(cond bool, cgs ...ConditionGroup) *UpdateBuilder

func (*UpdateBuilder) WherePK added in v0.5.2

func (b *UpdateBuilder) WherePK() *UpdateBuilder

func (*UpdateBuilder) WithContext added in v0.5.2

func (b *UpdateBuilder) WithContext(ctx context.Context) *UpdateBuilder

func (*UpdateBuilder) WithDB added in v0.5.2

func (b *UpdateBuilder) WithDB(db *sqlx.DB) *UpdateBuilder

Directories

Path Synopsis
cmd
fieldgen command
Package main 提供 mworm 字段常量生成器 用法:
Package main 提供 mworm 字段常量生成器 用法:

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL