mworm

package module
v0.4.4 Latest Latest
Warning

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

Go to latest
Published: Jun 5, 2026 License: MIT Imports: 17 Imported by: 0

README

mworm

mworm 是一个基于 sqlx 封装的 Go 语言 ORM 库,专为 PostgreSQL 和 MySQL 设计。它提供了一套流畅的 API 来构建 SQL 查询、处理复杂的条件逻辑、以及方便的结果集映射。

特别针对 PostgreSQL 的 JSONB、RETURNING 等特性进行了优化支持。

安装

go get github.com/ccxdd/mworm

快速开始

1. 初始化连接

在使用 mworm 之前,需要先绑定 sqlx.DB 对象。

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

func initDB() {
    // 连接数据库
    db, err := sqlx.Connect("pgx", "postgres://user:password@localhost:5432/dbname?sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }
    
    // 绑定到 mworm
    err = mworm.BindDB(db)
    if err != nil {
        log.Fatal(err)
    }
}
2. 定义模型与 Tag 规范

mworm 中,模型定义必须同时提供 dbjson tag。

核心规范:调用时使用 json tag 还是 db tag?
  • db tag:仅用于映射数据库底层的物理列名(以及标识主键 pk、排除更新 eu 等)。
  • json tag:除了用于 JSON 序列化,在调用 mworm 的所有链式查询、条件构造器(如 mworm.Eqmworm.Andmworm.Or 等)、排序(AscDesc)、字段设置(SetFieldSetExpression)时,传入的字段名参数必须使用 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 完美支持多字段复合主键,在 WherePKUpsert 等操作中会自动识别所有标记为 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
var id int64
err := mworm.INSERT(user).RETURNING(&id, nil, "id")
查询 (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)
更新 (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()

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

// 使用主键删除
err := mworm.DELETE(fav).WherePK().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"
)
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")
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. 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(PostgreSQL 使用 $1, $2 占位符)
mworm.ExecRawSQL("UPDATE users SET status = $1 WHERE id = $2", 1, 100)

// MySQL 使用 ? 占位符
// mworm.ExecRawSQL("UPDATE users SET status = ? WHERE id = ?", 1, 100)

// 原生 SQL 查询映射
var users []User
mworm.RawSQL("SELECT * FROM users WHERE age > 18").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"}`)
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()
查询单条 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)
排序 Asc(tag...) / Desc(tag...) Asc("id").Desc("createdAt") (必须使用 json tag)
原生 SQL Raw(express, args...) Raw("age > $1", 18)

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// SqlxDB 数据库连接对象
	SqlxDB *sqlx.DB
	// TagName 结构体 tag 名称
	TagName   = "db"
	DebugMode bool
)
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

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 StructToMap

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

func ValueTypeToStr added in v0.3.3

func ValueTypeToStr(v any) string

Types

type CRUDInterface

type CRUDInterface interface {
	CRUDMode(mode string) string
}

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 ArrayAny added in v0.4.4

func ArrayAny(tag string, arg any) ConditionGroup

ArrayAny 构造 = ANY() 条件分组

func ArrayOverlap added in v0.4.4

func ArrayOverlap(tag string, arg any) ConditionGroup

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

ILike 构造 AND ILIKE 条件分组

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 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, arg any) ConditionGroup

JsonbHasAllKeys 构造 JSONB ?& 条件分组

func JsonbHasAnyKeys added in v0.4.4

func JsonbHasAnyKeys(tag string, arg any) ConditionGroup

JsonbHasAnyKeys 构造 JSONB ?| 条件分组

func JsonbHasKey added in v0.4.4

func JsonbHasKey(tag string, arg any) ConditionGroup

JsonbHasKey 构造 JSONB ? 条件分组

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 NEqILike added in v0.4.4

func NEqILike(tag ...string) ConditionGroup

NEqILike 构造 AND ILIKE != 条件分组

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 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 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 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 DELETE

func DELETE(i ORMInterface) *OrmModel

DELETE 删除

func INSERT

func INSERT(i ORMInterface) *OrmModel

INSERT 插入

func O added in v0.1.4

func O() *OrmModel

func RawSQL

func RawSQL(sql string) *OrmModel

RawSQL 原生 SQL 查询

func SELECT

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

SELECT 查询

func Table

func Table(name string) *OrmModel

Table 指定表名

func UPDATE

func UPDATE(i ORMInterface) *OrmModel

UPDATE 更新

func (*OrmModel) AllowEmpty added in v0.3.12

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

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

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

Count 统计数量

func (*OrmModel) Delete

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

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

func (*OrmModel) Having added in v0.3.39

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

func (*OrmModel) If

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

func (*OrmModel) Insert

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

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 查询多条记录

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 查询单条记录

func (*OrmModel) RETURNING

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

func (*OrmModel) Select

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

func (*OrmModel) SetExpression added in v0.4.4

func (o *OrmModel) SetExpression(jsonTag string, expr string) *OrmModel

SetExpression UPDATE 使用自定义表达式设置字段值 expr 形如: "count + 1" 或 "jsonb_set(data, '{key}', '\"value\"')"

func (*OrmModel) SetField added in v0.1.11

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

SetField UPDATE 设置字段值

func (*OrmModel) Sum added in v0.4.3

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

Sum 求和

func (*OrmModel) Update

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

func (*OrmModel) Upsert added in v0.4.4

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

Upsert 极简版的 ON CONFLICT DO UPDATE 指定冲突列(通常是主键或唯一索引的 json tag),它会自动将其他所有有效字段组合为 EXCLUDED.xxx 进行更新

func (*OrmModel) Where

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

func (*OrmModel) WherePK

func (o *OrmModel) WherePK() *OrmModel

WherePK 使用dbTag里包含pk字符的jsonTag的字段进行查询。 db:"columnName,pk"

func (*OrmModel) With

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

With 关联查询

func (*OrmModel) WithAsc

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

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 (PageResult[T]) CalcTotalPage added in v0.3.1

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

CalcTotalPage 计算总页数

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)

func (SQLParams) TxMustExec added in v0.4.1

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

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