mworm

package module
v0.4.0 Latest Latest
Warning

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

Go to latest
Published: Mar 7, 2026 License: MIT Imports: 18 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. 定义模型

使用 db tag 映射数据库字段,json tag 用于 JSON 序列化及部分 mworm 内部逻辑(如分页结果)。

type User struct {
    ID        int64     `json:"id" db:"id,pk"`          // pk 标识主键
    Name      string    `json:"name" db:"name"`
    Age       int       `json:"age" db:"age"`
    Status    int       `json:"status" db:"status"`
    CreatedAt time.Time `json:"createdAt" db:"created_at"`
}

// 实现 TableName 接口(可选,默认使用结构体名,但建议显式指定)
func (u User) TableName() string {
    return "users"
}

常用功能

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

// PostgreSQL 支持 RETURNING
var id int64
err := mworm.INSERT(user).RETURNING(&id, nil, "id")
查询 (Select)
// 单条查询
var user User
err := mworm.SELECT(User{}).
    Where(mworm.Eq("id", 1)).
    One(&user)

// 多条查询
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()

// 更新指定字段
err := mworm.UPDATE(User{}).
    SetField("name", "Jerry").
    SetField("status", 2).
    Where(mworm.Eq("id", 1)).
    Exec()
删除 (Delete)
err := mworm.DELETE(User{}).
    Where(mworm.Eq("id", 1)).
    Exec()
2. 条件构造

mworm 提供了丰富的条件构造器,支持链式调用。

// 基础条件
mworm.And("name", "age")      // name = ? AND age = ? (值从结构体取)
mworm.Eq("status", 1)         // status = 1
mworm.Gt("age", 18)           // age > 18
mworm.Lt("age", 60)           // age < 60
mworm.In("status", 1, 2, 3)   // status IN (1, 2, 3)
mworm.Like("name")            // name LIKE '%value%'

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

// 组合条件
orm := mworm.SELECT(User{}).Where(
    mworm.AndAuto("name"),
    mworm.Gte("age", 18),
    mworm.Or(
        mworm.Eq("status", 1),
        mworm.Eq("status", 2),
    ),
)
3. 分页查询 (PostgreSQL 优化)

mworm.PAGE 利用 PostgreSQL 的 jsonb 特性进行高效分页查询。

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

if err != nil {
    log.Fatal(err)
}
fmt.Printf("Total: %d, List: %v\n", result.Total, result.List)
4. 高级特性
批量操作与事务
// 批量执行多个操作
err := mworm.Batch(
    mworm.INSERT(User{Name: "A"}),
    mworm.INSERT(User{Name: "B"}),
)

// 事务支持
err := mworm.BatchFunc(func(tx *sqlx.Tx) {
    // 在此处使用 tx 执行原生 sqlx 操作
    // 或者结合 mworm 使用(目前 mworm 主要绑定全局 DB,事务支持需注意上下文)
})
原生 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)

// 带命名参数的原生 SQL(params 为结构体)
type QueryParams struct {
    Age int `json:"age"`
}
mworm.RawNamedSQL("SELECT * FROM users WHERE age > :age", QueryParams{Age: 18}).Many(&users)
JSONB 支持 (PostgreSQL)
// 将查询结果聚合为 JSONB List
jsonStr, err := mworm.SELECT(User{}).JsonbListString()

// 将查询结果聚合为 JSONB Map
jsonMap, err := mworm.SELECT(User{}).JsonbMapString("id", "name")
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()

调试

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

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

字段常量生成器

使用字段常量替代字符串,提供编译期检查和 IDE 自动补全。

使用示例

假设你的项目结构如下:

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",
    Name:      "name",
    CreatedAt: "createdAt",
}
使用效果
import "myproject/models"

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

// 之后(类型安全,IDE 自动补全)
mworm.SELECT(user).Where(mworm.And(models.UserF.CreatedAt, models.UserF.Name))

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

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

BatchFunc 批量操作

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 NamedExec

func NamedExec(sqlStr string, params map[string]interface{}) error

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

func NamedQuery added in v0.1.4

func NamedQuery(query string, params any, dest any) error

NamedQuery 执行带命名参数的 SQL 查询并映射结果

func NamedQueryWithMap added in v0.3.1

func NamedQueryWithMap(query string, fieldMap map[string]any, dest any) error

NamedQueryWithMap 执行带命名参数的 SQL 查询并映射结果

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: 表达式
	// 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 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 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 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 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 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 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 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 (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 RawNamedSQL added in v0.1.18

func RawNamedSQL(sql string, params any) *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) 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) 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) Offset

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

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) SetField added in v0.1.11

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

SetField UPDATE 设置字段值

func (*OrmModel) Update

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

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
	WithSql string
	Params  map[string]interface{}
	Err     error
}

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