daox

package module
v1.1.1 Latest Latest
Warning

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

Go to latest
Published: May 31, 2025 License: MIT Imports: 14 Imported by: 6

README

daox

基于 sqlx 的轻量级数据库访问辅助工具,daox 的定位是 sqlx 的功能增强,不是一个 orm。

封装了基础 crud api,实现了sqlbuilder,通过 api 生成 sql,无需手动拼接。

实现了代码生成器,有内置生成文件模板,也可以自定义模板。

特性

  • 轻量级设计,专注于 SQL 操作的简化
  • 支持读写分离
  • 支持事务操作
  • 支持自动生成代码
  • 支持自定义字段映射
  • 内置 SQL 构建器
  • 支持 Context 传递
  • 支持自定义 Hook

安装

go get github.com/fengjx/daox

文档&示例

GoDoc

CRUD

在MySQL创建测试表

create table user_info
(
    id       bigint comment '主键',
    uid      bigint                not null,
    nickname varchar(32) default '' null comment '昵称',
    sex      tinyint     default 0 not null comment '性别',
    utime    bigint      default 0 not null comment '更新时间',
    ctime    bigint      default 0 not null comment '创建时间',
    primary key pk(id),
    unique uni_uid (uid)
) comment '用户信息表';

创建 dao 对象

// 1. 使用全局默认DB
db := sqlx.MustOpen("mysql", "root:1234@tcp(localhost:3306)/demo")
db.Mapper = reflectx.NewMapperFunc("json", strings.ToTitle)
// 注册全局DB
daox.UseDefaultMasterDB(db)
dao := daox.NewDao[*User](tableName, "id", daox.IsAutoIncrement())

// 2. 使用 NewDao 创建,指定主从库
masterDB := sqlx.MustOpen("mysql", "root:1234@tcp(localhost:3306)/demo")
readDB := sqlx.MustOpen("mysql", "root:1234@tcp(localhost:3307)/demo")
masterDB.Mapper = reflectx.NewMapperFunc("json", strings.ToTitle)
readDB.Mapper = reflectx.NewMapperFunc("json", strings.ToTitle)
dao := daox.NewDao[*User](tableName, "id", 
    daox.IsAutoIncrement(),
    daox.WithDBMaster(masterDB),
    daox.WithDBRead(readDB),
)

// 3. 使用 meta 接口创建
dao := daox.NewDaoByMeta(UserMeta)

新增

ctx := context.Background()

// 单条插入
user := &User{
    Uid:      1001,
    Nickname: "test",
    Sex:      1,
    Utime:    time.Now().Unix(),
    Ctime:    time.Now().Unix(),
}
id, err := dao.SaveContext(ctx, user)
if err != nil {
    log.Panic(err)
}

// 批量插入
users := make([]*User, 0)
for i := 0; i < 20; i++ {
    sec := time.Now().Unix()
    user := &User{
        Uid:      100 + int64(i),
        Nickname: randString(6),
        Sex:      int32(i) % 2,
        Utime:    sec,
        Ctime:    sec,
    }
    users = append(users, user)
}
affected, err := dao.BatchSaveContext(ctx, users)
if err != nil {
    log.Panic(err)
}

// Replace Into 插入
id, err = dao.ReplaceIntoContext(ctx, user)

// Insert Ignore 插入
id, err = dao.IgnoreIntoContext(ctx, user)

查询

ctx := context.Background()

// id 查询
user := new(User)
exists, err := dao.GetByIDContext(ctx, 1, user)

// 批量id查询
var list []*User
err = dao.ListByIDsContext(ctx, &list, 10, 11)

// 指定字段查询单条记录
user := new(User)
exists, err := dao.GetByColumnContext(ctx, daox.OfKv("uid", 10000), user)

// 指定字段查询多条记录
var list []*User
err := dao.ListContext(ctx, daox.OfKv("sex", 0), &list)

// 指定字段查询多个值
var list []*User
err = dao.ListByColumnsContext(ctx, daox.OfMultiKv("uid", 10000, 10001), &list)

修改

ctx := context.Background()

// 全字段更新
user := new(User)
exists, err := dao.GetByIDContext(ctx, 10, user)
user.Nickname = "update-name-10"
ok, err := dao.UpdateContext(ctx, user)

// 部分字段更新
ok, err = dao.UpdateFieldContext(ctx, 11, map[string]any{
    "nickname": "update-name-11",
})

// 条件更新
ok, err = dao.UpdateByCondContext(ctx, user, 
    sqlbuilder.C().Where(true, "age > ?").And(true, "sex = ?"),
    "create_time", // 忽略更新的字段
)

删除

ctx := context.Background()

// 按 id 删除
ok, err := dao.DeleteByIDContext(ctx, 21)

// 按指定字段删除
affected, err := dao.DeleteByColumnContext(ctx, daox.OfKv("uid", 101))

// 按字段删除多条记录
affected, err = dao.DeleteByColumnsContext(ctx, daox.OfMultiKv("uid", 102, 103))
sqlbuilder

创建Builder对象

// 通过dao对象实例方法创建
dao.SQLBuilder()

// 独立使用
sqlbuilder.New("user_info")

构造sql

// 查询
querySQL, err := sqlbuilder.New("user_info").Select().
    Columns("id", "username", "age", "sex", "ctime").
    Where(
        sqlbuilder.C().
            Where(true, "age > ?").
            And(true, "sex = ?"),
    ).
    OrderBy(sqlbuilder.Desc("ctime")).
    Offset(10).
    Limit(10).Sql()
// SELECT `id`, `username`, `age`, `sex`, `ctime` FROM `user_info` WHERE age > ? AND sex = ? ORDER BY `ctime` DESC LIMIT 10 OFFSET 10;

// 插入
inserter := sqlbuilder.New("user_info").Insert().
    Columns("username", "age", "sex")

sql, err := inserter.Sql()
//  INSERT INTO `user_info`(`username`, `age`, `sex`) VALUES (?, ?, ?);

nameSql, err := inserter.NameSql()
// INSERT INTO `user_info`(`username`, `age`, `sex`) VALUES (:username, :age, :sex);

// 更新
updateSQL, err := sqlbuilder.New("user_info").
    Update().
    Columns("username", "age").
    Where(sqlbuilder.C().Where(true, "id = ?")).
    Sql()
// UPDATE `user_info` SET `username` = ?, `age` = ? WHERE id = ?;

// 删除
deleteSQL, err := sqlbuilder.New("user_info").Delete().
    Where(sqlbuilder.C().Where(true, "id = ?")).
    Sql()
// DELETE FROM `user_info` WHERE id = ?;

更多示例请查看sqlbuilder/sql_test.go

Hook

daox 支持注册 Hook 来实现 SQL 执行前后的自定义处理:

// 全局 Hook
daox.RegisterHook(func(ctx context.Context, stmt string, args []any) {
    log.Printf("sql: %s, args: %v", stmt, args)
})

// 单个 dao 实例的 Hook
dao := daox.NewDao[*User](tableName, "id", 
    daox.WithHook(func(ctx context.Context, stmt string, args []any) {
        log.Printf("sql: %s, args: %v", stmt, args)
    }),
)
事务

daox 支持事务操作,示例如下:

ctx := context.Background()
tx, err := dao.GetMasterDB().Begin()
if err != nil {
    return err
}
defer tx.Rollback()

// 创建事务 dao
txDao := dao.WithExecutor(tx)

// 执行事务操作
id, err := txDao.SaveContext(ctx, user)
if err != nil {
    return err
}

affected, err := txDao.UpdateFieldContext(ctx, id, map[string]any{
    "nickname": "tx-update",
})
if err != nil {
    return err
}

return tx.Commit()
代码生成
安装代码生成工具
$ go install github.com/fengjx/daox/cmd/gen@latest
$ gen -h

GLOBAL OPTIONS:
   -f value    config file path
   --help, -h  show help

生成代码

$ gen -f gen.yml

配置示例说明

ds:
  type: mysql
  dsn: root:1234@tcp(localhost:3306)/demo
target:
  custom:
    tag-name: json
    out-dir: ./out
    template-dir:
    var:
      a: aa
      b: bb
    tables:
      user:
        module: sys
      blog:
        module: core
参数 必须 说明
ds.type 数据库类型,暂时值支持 mysql
ds.dsn 数据库连接
target.custom.tag-name model 字段的 tagName
target.custom.out-dir 文件生成路径
target.custom.template-dir 自定义模板文件路径
target.custom.var 自定义参数,map结构,可以在模板文件中使用
target.custom.tables 需要生成文件的表名,list 结构

自定义模板说明

通过text/template来渲染文件内容,模板语法不在此赘述,可自行查看参考文档。

模板中可以使用的变量,详细可以查看源码cmd/gen/gen.go

attr := map[string]any{
    "Var":     config.Target.Custom.Var,
    "TagName": config.Target.Custom.TagName,
    "Table":   table,
}

模板中可以使用的函数

  • utils.FirstUpper: 首字母大写
  • utils.FirstLower: 首字母小写
  • utils.SnakeCase: 转下划线风格字符串
  • utils.TitleCase: 转驼峰风格字符串
  • utils.GonicCase: 转go风格驼峰字符串,user_id -> userID
  • utils.LineString: 空字符串使用横线"-"代替
  • SQLType2GoTypeString: sql类型转go类型字符串
funcMap := template.FuncMap{
    "FirstUpper":           utils.FirstUpper,
    "FirstLower":           utils.FirstLower,
    "SnakeCase":            utils.SnakeCase,
    "TitleCase":            utils.TitleCase,
    "GonicCase":            utils.GonicCase,
    "LineString":           utils.LineString,
    "SQLType2GoTypeString": SQLType2GoTypeString,
}

参考_example/gen

License

MIT License

Documentation

Index

Constants

View Source
const (
	OpAnd Op = "and"
	OpOr  Op = "or"

	ConditionTypeEq      ConditionType = "eq"       // 等于
	ConditionTypeNotEq   ConditionType = "not_eq"   // 不等于
	ConditionTypeLike    ConditionType = "like"     // 模糊匹配
	ConditionTypeNotLike ConditionType = "not_like" // 不包含
	ConditionTypeIn      ConditionType = "in"       // in
	ConditionTypeNotIn   ConditionType = "not_in"   // not in
	ConditionTypeGt      ConditionType = "gt"       // 大于
	ConditionTypeLt      ConditionType = "lt"       // 小于
	ConditionTypeGte     ConditionType = "gte"      // 大于等于
	ConditionTypeLte     ConditionType = "lte"      // 小于等于

	OrderTypeAsc  OrderType = "asc"  // 升序
	OrderTypeDesc OrderType = "desc" // 降序
)

Variables

View Source
var (
	// ErrUpdatePrimaryKeyRequire 更新操作必须提供主键值
	ErrUpdatePrimaryKeyRequire = errors.New("[daox] Primary key require for update")
	// ErrTxNil 事务对象为空
	ErrTxNil = errors.New("[daox] Tx is nil")
)

Functions

func Delete

func Delete(ctx context.Context, execer engine.Execer, record DeleteRecord) (int64, error)

Delete 通用 delete 操作

func Get

func Get[T any](ctx context.Context, dbx *sqlx.DB, record GetRecord) (*T, error)

Get 查询单条记录

func GetMap

func GetMap(ctx context.Context, dbx *sqlx.DB, record GetRecord) (map[string]any, error)

GetMap 查询单条记录,返回 map

func Insert

func Insert(ctx context.Context, execer engine.Execer, record InsertRecord, opts ...InsertOption) (int64, error)

Insert 通用 insert 操作

func PrintSQL added in v1.1.0

func PrintSQL(p engine.AfterHandler)

PrintSQL 打印sql处理

func Update

func Update(ctx context.Context, execer engine.Execer, record UpdateRecord) (int64, error)

Update 通用 update 操作

func UseDefaultMasterDB

func UseDefaultMasterDB(master *sqlx.DB)

UseDefaultMasterDB 默认主库

func UseDefaultReadDB

func UseDefaultReadDB(read *sqlx.DB)

UseDefaultReadDB 默认从库

func UseHooks added in v1.1.0

func UseHooks(hooks ...engine.Hook)

UseHooks 使用全局 hook

func UseOmits added in v1.1.0

func UseOmits(omits ...string)

UseOmits 设置保存时全局默认忽略的字段

Types

type Condition

type Condition struct {
	Disable       bool          `json:"disable"`        // true 禁用该条件
	Op            Op            `json:"op"`             // and or 连接符
	Field         string        `json:"field"`          // 查询条件字段
	Vals          []any         `json:"vals"`           // 查询字段值
	ConditionType ConditionType `json:"condition_type"` // 查找类型
}

Condition 条件语句

type ConditionType

type ConditionType string

type DB added in v1.1.0

type DB struct {
	*sqlx.DB
	// contains filtered or unexported fields
}

DB 包装 sqlx.DB

func NewDb added in v1.1.0

func NewDb(db *sqlx.DB, hooks ...engine.Hook) *DB

NewDb 创建 DB

func (*DB) Beginx added in v1.1.0

func (d *DB) Beginx() (*Tx, error)

Beginx 打开一个事务

func (*DB) ExecContext added in v1.1.0

func (d *DB) ExecContext(ctx context.Context, execSQL string, args ...any) (sql.Result, error)

ExecContext 使用数组参数执行sql

func (*DB) GetContext added in v1.1.0

func (d *DB) GetContext(ctx context.Context, dest any, query string, args ...any) error

GetContext 查询单条数据

func (*DB) NamedExecContext added in v1.1.0

func (d *DB) NamedExecContext(ctx context.Context, execSQL string, arg any) (sql.Result, error)

NamedExecContext 使用命名参数执行sql

func (*DB) SelectContext added in v1.1.0

func (d *DB) SelectContext(ctx context.Context, dest any, query string, args ...any) error

SelectContext 查询多条数据

type Dao

type Dao struct {
	TableMeta *TableMeta // 表元数据
	// contains filtered or unexported fields
}

Dao 数据访问对象,封装了数据库操作的基础方法

func NewDao added in v1.1.0

func NewDao[T Model](tableName string, primaryKey string, opts ...Option) *Dao

NewDao 创建一个新的 dao 对象 tableName: 表名 primaryKey: 主键字段名 opts: 可选配置项,如自增主键、字段映射等 返回值: 创建的Dao对象指针

func NewDaoByMeta added in v1.1.0

func NewDaoByMeta(m Meta, opts ...Option) *Dao

NewDaoByMeta 根据 meta 接口创建 dao 对象 m: 表元数据接口 opts: 可选配置项 返回值: 创建的Dao对象指针

func (*Dao) BatchReplaceInto

func (d *Dao) BatchReplaceInto(models any, opts ...InsertOption) (sql.Result, error)

BatchReplaceInto 批量新增,使用 replace into 方式 models 是一个 slice omitColumns 不需要 insert 的字段

func (*Dao) BatchReplaceIntoContext

func (d *Dao) BatchReplaceIntoContext(ctx context.Context, models any, opts ...InsertOption) (sql.Result, error)

BatchReplaceIntoContext 批量新增,使用 replace into 方式,携带上下文 models 是一个 slice omitColumns 不需要 insert 的字段

func (*Dao) BatchSave

func (d *Dao) BatchSave(models any, opts ...InsertOption) (sql.Result, error)

BatchSave 批量新增,携带上下文 omitColumns 不需要 insert 的字段

func (*Dao) BatchSaveContext

func (d *Dao) BatchSaveContext(ctx context.Context, models any, opts ...InsertOption) (sql.Result, error)

BatchSaveContext 批量新增 omitColumns 不需要 insert 的字段 models 是一个批量 insert 的 slice

func (*Dao) DBColumns

func (d *Dao) DBColumns(omitColumns ...string) []string

DBColumns 获取当前表数据库字段 omitColumns: 需要忽略的字段列表 返回值: 字段名列表

func (*Dao) DeleteByColumn

func (d *Dao) DeleteByColumn(kv *KV) (int64, error)

DeleteByColumn 按字段名删除

func (*Dao) DeleteByColumnContext

func (d *Dao) DeleteByColumnContext(ctx context.Context, kv *KV) (int64, error)

DeleteByColumnContext 按字段名删除,携带上下文

func (*Dao) DeleteByColumns

func (d *Dao) DeleteByColumns(kvs *MultiKV) (int64, error)

DeleteByColumns 指定字段删除多个值

func (*Dao) DeleteByColumnsContext

func (d *Dao) DeleteByColumnsContext(ctx context.Context, kvs *MultiKV) (int64, error)

DeleteByColumnsContext 指定字段删除多个值,携带上下文

func (*Dao) DeleteByID

func (d *Dao) DeleteByID(id any) (bool, error)

DeleteByID 根据id删除数据

func (*Dao) DeleteByIDContext

func (d *Dao) DeleteByIDContext(ctx context.Context, id any) (bool, error)

DeleteByIDContext 根据id删除数据,携带上下文

func (*Dao) Deleter added in v1.1.0

func (d *Dao) Deleter() *sqlbuilder.Deleter

Deleter 创建当前表的删除构建器 返回值: 删除构建器对象

func (*Dao) GetByColumn

func (d *Dao) GetByColumn(kv *KV, dest Model) (bool, error)

GetByColumn 按指定字段查询单条数据 bool 数据是否存在

func (*Dao) GetByColumnContext

func (d *Dao) GetByColumnContext(ctx context.Context, kv *KV, dest Model) (bool, error)

GetByColumnContext 按指定字段查询单条数据,携带上下文 bool 数据是否存在

func (*Dao) GetByID

func (d *Dao) GetByID(id any, dest Model) (bool, error)

GetByID 根据 id 查询单条数据

func (*Dao) GetByIDContext

func (d *Dao) GetByIDContext(ctx context.Context, id any, dest Model) (bool, error)

GetByIDContext 根据 id 查询单条数据,携带上下文

func (*Dao) GetColumnsByModel

func (d *Dao) GetColumnsByModel(model any, omitColumns ...string) []string

GetColumnsByModel 根据 model 结构获取数据库字段 model: 模型结构体 omitColumns: 需要忽略的字段列表 返回值: 字段名列表

func (*Dao) GetColumnsByType

func (d *Dao) GetColumnsByType(typ reflect.Type, omitColumns ...string) []string

GetColumnsByType 通过字段 tag 解析数据库字段 typ: 结构体类型 omitColumns: 需要忽略的字段列表 返回值: 字段名列表

func (*Dao) GetMasterDB

func (d *Dao) GetMasterDB() *DB

GetMasterDB 返回主库连接 返回值: 主库连接对象

func (*Dao) GetReadDB

func (d *Dao) GetReadDB() *DB

GetReadDB 返回从库连接 返回值: 从库连接对象

func (*Dao) IgnoreInto

func (d *Dao) IgnoreInto(model Model, opts ...InsertOption) (sql.Result, error)

IgnoreInto 使用 INSERT IGNORE INTO 如果记录已存在则忽略 omitColumns 不需要 insert 的字段

func (*Dao) IgnoreIntoContext

func (d *Dao) IgnoreIntoContext(ctx context.Context, model Model, opts ...InsertOption) (sql.Result, error)

IgnoreIntoContext 使用 INSERT IGNORE INTO 如果记录已存在则忽略,携带上下文 omitColumns 不需要 insert 的字段

func (*Dao) Inserter added in v1.1.0

func (d *Dao) Inserter(opts ...InsertOption) *sqlbuilder.Inserter

Inserter 创建当前表的插入构建器 opts: 插入选项,如忽略字段等 返回值: 插入构建器对象

func (*Dao) List

func (d *Dao) List(kv *KV, dest any) error

List 指定字段查询多条数据

func (*Dao) ListByColumns

func (d *Dao) ListByColumns(kvs *MultiKV, dest any) error

ListByColumns 指定字段多个值查询多条数据 dest: slice pointer

func (*Dao) ListByColumnsContext

func (d *Dao) ListByColumnsContext(ctx context.Context, kvs *MultiKV, dest any) error

ListByColumnsContext 指定字段多个值查询多条数据,携带上下文 dest: slice pointer

func (*Dao) ListByIDs

func (d *Dao) ListByIDs(dest any, ids ...any) error

ListByIDs 根据 id 查询多条数据

func (*Dao) ListByIDsContext

func (d *Dao) ListByIDsContext(ctx context.Context, dest any, ids ...any) error

ListByIDsContext 根据 id 查询多条数据,携带上下文

func (*Dao) ListContext

func (d *Dao) ListContext(ctx context.Context, kv *KV, dest any) error

ListContext 指定字段查询多条数据,携带上下文

func (*Dao) ReplaceInto

func (d *Dao) ReplaceInto(dest Model, opts ...InsertOption) (sql.Result, error)

ReplaceInto replace into table omitColumns 不需要 insert 的字段

func (*Dao) ReplaceIntoContext

func (d *Dao) ReplaceIntoContext(ctx context.Context, model Model, opts ...InsertOption) (sql.Result, error)

ReplaceIntoContext replace into table,携带上下文 omitColumns 不需要 insert 的字段

func (*Dao) SQLBuilder

func (d *Dao) SQLBuilder() *sqlbuilder.Builder

SQLBuilder 创建当前表的 SQL 构建器 返回值: SQL构建器对象

func (*Dao) Save

func (d *Dao) Save(dest Model, opts ...InsertOption) (int64, error)

Save 插入数据 dest: 要插入的数据对象 opts: 插入选项 返回值: 插入ID,错误信息

func (*Dao) SaveContext

func (d *Dao) SaveContext(ctx context.Context, dest Model, opts ...InsertOption) (int64, error)

SaveContext 插入数据,携带上下文 ctx: 上下文 dest: 要插入的数据对象 opts: 插入选项 返回值: 插入ID,错误信息

func (*Dao) Selector

func (d *Dao) Selector(columns ...string) *sqlbuilder.Selector

Selector 创建当前表的查询构建器 columns: 查询的字段列表,为空则查询全部字段 返回值: 查询构建器对象

func (*Dao) TableName

func (d *Dao) TableName() string

TableName 获取当前表名 返回值: 表名

func (*Dao) Update

func (d *Dao) Update(m Model, omitColumns ...string) (bool, error)

Update 全字段更新

func (*Dao) UpdateByCond

func (d *Dao) UpdateByCond(model Model, where sqlbuilder.ConditionBuilder, omitColumns ...string) (bool, error)

UpdateByCond 按条件更新全部字段

func (*Dao) UpdateByCondContext

func (d *Dao) UpdateByCondContext(ctx context.Context, model Model, where sqlbuilder.ConditionBuilder, omitColumns ...string) (bool, error)

UpdateByCondContext 按条件更新全部字段

func (*Dao) UpdateContext

func (d *Dao) UpdateContext(ctx context.Context, model Model, omitColumns ...string) (bool, error)

UpdateContext 全字段更新,携带上下文

func (*Dao) UpdateField

func (d *Dao) UpdateField(idValue any, fieldMap map[string]any) (bool, error)

UpdateField 部分字段更新

func (*Dao) UpdateFieldContext

func (d *Dao) UpdateFieldContext(ctx context.Context, idValue any, fieldMap map[string]any) (bool, error)

UpdateFieldContext 部分字段更新,携带上下文

func (*Dao) Updater added in v1.1.0

func (d *Dao) Updater() *sqlbuilder.Updater

Updater 创建当前表的更新构建器 返回值: 更新构建器对象

func (*Dao) With

func (d *Dao) With(master, read *sqlx.DB) *Dao

With 使用新的数据库连接创建 Dao

func (*Dao) WithExecutor added in v1.1.0

func (d *Dao) WithExecutor(executor engine.Executor) *Dao

func (*Dao) WithTableName added in v1.1.0

func (d *Dao) WithTableName(tableName string) *Dao

WithTableName 使用新的数据库连接创建 Dao

type DeleteRecord

type DeleteRecord struct {
	TableName  string      `json:"table_name"` // 表名
	Conditions []Condition `json:"conditions"` // 条件字段
}

DeleteRecord 删除记录

type GetRecord

type GetRecord struct {
	TableName  string      `json:"table_name"`           // 查询表
	Fields     []string    `json:"fields"`               // 投影字段
	Conditions []Condition `json:"conditions,omitempty"` // 查找字段
}

GetRecord 单条记录查询

func (GetRecord) ToSQLArgs

func (r GetRecord) ToSQLArgs() (sql string, args []any, err error)

ToSQLArgs 返回 sql 语句和参数

type InsertOption

type InsertOption func(*InsertOptions)

func DisableGlobalInsertOmits added in v1.1.0

func DisableGlobalInsertOmits(disable bool) InsertOption

DisableGlobalInsertOmits insert 数据时,禁用全局忽略字段

func WithInsertOmits added in v1.1.0

func WithInsertOmits(omits ...string) InsertOption

WithInsertOmits 当前 insert 时,忽略的字段

type InsertOptions

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

InsertOptions insert 选项

type InsertRecord

type InsertRecord struct {
	TableName string         `json:"table_name"` // 表名
	Row       map[string]any `json:"row"`        // 行数据
}

InsertRecord 插入记录

type KV

type KV struct {
	Key   string // 字段名
	Value any    // 字段值,支持任意类型
}

KV 表示键值对结构

func OfKv

func OfKv(key string, value any) *KV

OfKv 创建一个新的键值对 key: 字段名 value: 字段值

type LogHook added in v1.1.0

type LogHook struct {
	Print engine.AfterHandler
}

LogHook 打印日志中间件

func NewLogHook added in v1.1.0

func NewLogHook(p engine.AfterHandler) *LogHook

NewLogHook 创建打印日志中间件

func (LogHook) After added in v1.1.0

After 执行后

func (LogHook) Before added in v1.1.0

func (l LogHook) Before(ctx context.Context, ec *engine.ExecutorContext) error

Before 执行前

type Meta added in v1.1.0

type Meta interface {
	// TableName 获取表名
	TableName() string
	// PrimaryKey 获取主键字段名
	PrimaryKey() string
	// IsAutoIncrement 判断主键是否自增
	IsAutoIncrement() bool
	// Columns 获取表的所有字段
	Columns() []string
}

Meta 数据库表元信息定义接口,用于自定义表元信息的获取方式

type Model

type Model interface {
	// GetID 获取模型的主键值
	GetID() any
}

Model 数据库模型接口,所有数据库模型结构体都需要实现此接口

type MultiKV

type MultiKV struct {
	Key    string // 字段名
	Values []any  // 字段值列表,支持任意类型
}

MultiKV 表示一个字段对应多个值的结构,用于 IN 查询等场景

func OfMultiKv

func OfMultiKv(key string, values ...any) *MultiKV

OfMultiKv 创建一个新的多值键值对 key: 字段名 values: 字段值列表

func (*MultiKV) AddValue

func (kv *MultiKV) AddValue(val any) *MultiKV

AddValue 向多值键值对中添加一个值 val: 要添加的值

type Op

type Op string

Op and or连接符

type Option

type Option func(*Options)

func IsAutoIncrement

func IsAutoIncrement() Option

IsAutoIncrement 是否自增主键

func WithDBMaster

func WithDBMaster(master *sqlx.DB) Option

WithDBMaster 设置主库

func WithDBRead

func WithDBRead(read *sqlx.DB) Option

WithDBRead 设置从库

func WithHooks added in v1.1.0

func WithHooks(hooks ...engine.Hook) Option

WithHooks 设置中间件

func WithIfNullVal added in v1.1.0

func WithIfNullVal(col string, val string) Option

WithIfNullVal 设置字段为null时的默认值

func WithIfNullVals added in v1.1.0

func WithIfNullVals(vals map[string]string) Option

WithIfNullVals 设置字段(多个)为null时的默认值

func WithMapper

func WithMapper(mapper *reflectx.Mapper) Option

WithMapper 设置字段映射

func WithOmitColumns added in v1.1.0

func WithOmitColumns(omitColumns ...string) Option

WithOmitColumns 设置忽略字段

func WithPrintSQL added in v1.1.0

func WithPrintSQL(printSQL engine.AfterHandler) Option

WithPrintSQL 打印 sql 回调

func WithTableName

func WithTableName(tableName string) Option

WithTableName 设置表名

type Options added in v1.1.0

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

type OrderField

type OrderField struct {
	Field     string    `json:"field"`
	OrderType OrderType `json:"order_type"`
}

OrderField 排序字段

type OrderType

type OrderType string

type Page

type Page struct {
	Offset     int64 `json:"offset"`      // 游标起始位置
	Limit      int64 `json:"limit"`       // 每页记录数
	HasNext    bool  `json:"has_next"`    // 是否有下一页
	Count      int64 `json:"count"`       // 总记录数
	QueryCount bool  `json:"query_count"` // 是否查询总数
}

Page 分页参数

func Find

func Find[T any](ctx context.Context, queryer engine.Queryer, query QueryRecord) (list []T, page *Page, err error)

Find 通用查询封装

func FindListMap

func FindListMap(ctx context.Context, queryer engine.Queryer, query QueryRecord) (list []map[string]any, page *Page, err error)

FindListMap 通用查询封装,返回 map 类型

type QueryRecord

type QueryRecord struct {
	TableName   string       `json:"table_name"`             // 查询表
	Fields      []string     `json:"fields"`                 // 投影字段
	Conditions  []Condition  `json:"conditions,omitempty"`   // 查找字段
	OrderFields []OrderField `json:"order_fields,omitempty"` // 排序字段
	Page        *Page        `json:"page,omitempty"`         // 分页参数
}

QueryRecord 查询参数

func (QueryRecord) ToCountSQLArgs

func (q QueryRecord) ToCountSQLArgs() (sql string, args []any, err error)

ToCountSQLArgs 返回 count 查询 sql 语句和参数

func (QueryRecord) ToSQLArgs

func (q QueryRecord) ToSQLArgs() (sql string, args []any, err error)

ToSQLArgs 返回 sql 语句和参数

type TableMeta

type TableMeta struct {
	TableName       string   // 表名
	Columns         []string // 表字段列表
	PrimaryKey      string   // 主键字段名
	IsAutoIncrement bool     // 主键是否自增
}

TableMeta 数据库表元信息,包含表的基本信息和字段定义

func GetMetaInfo added in v1.1.0

func GetMetaInfo(tableName string) (TableMeta, bool)

GetMetaInfo 根据表名获得元信息

func (TableMeta) OmitColumns

func (meta TableMeta) OmitColumns(omit ...string) []string

OmitColumns 获取排除指定字段后的字段列表 omit: 需要排除的字段列表 返回值: 排除指定字段后的字段列表

func (TableMeta) WithTableName added in v1.1.0

func (meta TableMeta) WithTableName(tableName string) *TableMeta

WithTableName 设置表名,一般用在分表的场景,设置实际物理表名 tableName: 新的表名

type Tx added in v1.1.0

type Tx struct {
	*sqlx.Tx
	// contains filtered or unexported fields
}

func (*Tx) ExecContext added in v1.1.0

func (t *Tx) ExecContext(ctx context.Context, execSQL string, args ...any) (sql.Result, error)

ExecContext 使用数组参数执行sql

func (*Tx) GetContext added in v1.1.0

func (t *Tx) GetContext(ctx context.Context, dest any, query string, args ...any) error

GetContext 查询单条数据

func (*Tx) NamedExecContext added in v1.1.0

func (t *Tx) NamedExecContext(ctx context.Context, execSQL string, arg any) (sql.Result, error)

NamedExecContext 使用命名参数执行sql

func (*Tx) SelectContext added in v1.1.0

func (t *Tx) SelectContext(ctx context.Context, dest any, query string, args ...any) error

SelectContext 查询多条数据

type TxFun

type TxFun func(txCtx context.Context, executor engine.Executor) error

TxFun 事务处理函数

type TxManager

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

TxManager 事务管理器

func NewTxManager

func NewTxManager(db *sqlx.DB) *TxManager

NewTxManager 创建事务管理器

func (*TxManager) ExecTx

func (m *TxManager) ExecTx(ctx context.Context, fn TxFun) (err error)

ExecTx 事务处理

type UpdateRecord

type UpdateRecord struct {
	TableName  string         `json:"table_name"` // 表名
	Row        map[string]any `json:"row"`        // 要修改的行记录
	Conditions []Condition    `json:"conditions"` // 条件字段
}

UpdateRecord 更新记录

Directories

Path Synopsis
cmd
gen
ql

Jump to

Keyboard shortcuts

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