Compare commits
21 Commits
4acb528533
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 58d0c8687b | |||
| 1f20a8fc9e | |||
| 2047b54036 | |||
| 25e6913379 | |||
| a553d8a896 | |||
| f056271667 | |||
| 4269707e46 | |||
| 18e90ec4f6 | |||
| 77c6398829 | |||
| 4c3f6f2a43 | |||
| ad300277f8 | |||
| 5a63f40dda | |||
| 74026cf1ac | |||
| c5ca01eb47 | |||
| 6f9150ab08 | |||
| 5b9917cfb0 | |||
| 712250101e | |||
| 8db7966187 | |||
| 8509a12ff7 | |||
| c64e328ea4 | |||
| cb3d32c360 |
@ -17,7 +17,7 @@ import (
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:06 2023/10/14
|
||||
type IDatabase interface {
|
||||
type IDatabase[DatabaseDataType any, DatabaseTableColumns any] interface {
|
||||
// Create 创建数据
|
||||
Create(dbInstance *gorm.DB, data any, optionList ...define.SetOption) error
|
||||
// Update 更新数据
|
||||
@ -25,13 +25,13 @@ type IDatabase interface {
|
||||
// UpdateOne 更新一条数据
|
||||
UpdateOne(dbInstance *gorm.DB, updateData any, optionFuncList ...define.SetOption) (int64, error)
|
||||
// List 查询数据列表
|
||||
List(dbInstance *gorm.DB, result any, optionFuncList ...define.SetOption) error
|
||||
List(dbInstance *gorm.DB, result *[]DatabaseDataType, optionFuncList ...define.SetOption) error
|
||||
// ListAndTotal 查询列表并返回满足条件数据总数
|
||||
ListAndTotal(dbInstance *gorm.DB, listRes any, totalRes *int64, disableTotal bool, optionFuncList ...define.SetOption) error
|
||||
ListAndTotal(dbInstance *gorm.DB, listRes *[]DatabaseDataType, totalRes *int64, disableTotal bool, optionFuncList ...define.SetOption) error
|
||||
// Delete 删除数据
|
||||
Delete(dbInstance *gorm.DB, dataModel any, optionFuncList ...define.SetOption) (int64, error)
|
||||
Delete(dbInstance *gorm.DB, dataModel *DatabaseDataType, optionFuncList ...define.SetOption) (int64, error)
|
||||
// Detail 数据详情
|
||||
Detail(dbInstance *gorm.DB, result any, optionFuncList ...define.SetOption) error
|
||||
Detail(dbInstance *gorm.DB, result *DatabaseDataType, optionFuncList ...define.SetOption) error
|
||||
// IsNotFound 错误是否为数据不存在
|
||||
IsNotFound(err error) bool
|
||||
// Count 查询数据数量
|
||||
@ -45,5 +45,13 @@ type IDatabase interface {
|
||||
// Rollback 回滚事务
|
||||
Rollback(db *gorm.DB) error
|
||||
// DetailByPrimaryID 根据主键ID, 查询任意表的数据详情
|
||||
DetailByPrimaryID(dbInstance *gorm.DB, result any, primaryID any, primaryKey ...string) error
|
||||
DetailByPrimaryID(dbInstance *gorm.DB, result *DatabaseDataType, primaryID any, primaryKey ...string) error
|
||||
// ColumnComment 表字段注释
|
||||
ColumnComment() map[string]string
|
||||
// Columns 表字段定义
|
||||
Columns() DatabaseTableColumns
|
||||
// DetailForAny 任意数据详情
|
||||
DetailForAny(tx *gorm.DB, tableName string, result any, optionList ...define.SetOption) error
|
||||
// ListForAny 任意数据列表
|
||||
ListForAny(tx *gorm.DB, tableName string, data any, optionList ...define.SetOption) error
|
||||
}
|
||||
|
||||
189
base.go
189
base.go
@ -7,83 +7,67 @@ package database
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"reflect"
|
||||
|
||||
"git.zhangdeman.cn/zhangdeman/database/define"
|
||||
"gorm.io/gorm"
|
||||
"reflect"
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
func NewBaseDao[DatabaseDataType any, DatabaseTableColumns any]() *BaseDao[DatabaseDataType, DatabaseTableColumns] {
|
||||
res := &BaseDao[DatabaseDataType, DatabaseTableColumns]{}
|
||||
res.tableName = res.TableName()
|
||||
res.columns = res.Columns()
|
||||
res.isSetColumns = true
|
||||
res.columnComment = res.ColumnComment()
|
||||
return res
|
||||
}
|
||||
|
||||
// BaseDao 基础dao层
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 14:13 2023/2/9
|
||||
type BaseDao struct {
|
||||
TableName string // 继承BaseDao,需要指定表名,后续调用不用传递表名进来,如果分表了,使用SetOption设置表名, 这里的优先级更高
|
||||
type BaseDao[DatabaseDataType any, DatabaseTableColumns any] struct {
|
||||
tableName string // 继承BaseDao,需要指定表名,后续调用不用传递表名进来,如果分表了,使用SetOption设置表名, 这里的优先级更高
|
||||
isSetColumns bool
|
||||
columns DatabaseTableColumns
|
||||
columnComment map[string]string
|
||||
}
|
||||
|
||||
// Create 创建新的数据
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 8:06 下午 2021/8/8
|
||||
func (b *BaseDao) Create(dbInstance *gorm.DB, data any, optionList ...define.SetOption) error {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Create(dbInstance *gorm.DB, data any, optionList ...define.SetOption) error {
|
||||
o := &define.Option{}
|
||||
for _, itemFunc := range optionList {
|
||||
itemFunc(o)
|
||||
}
|
||||
tableName := b.TableName
|
||||
useTableName := b.tableName
|
||||
if len(o.Table) > 0 {
|
||||
tableName = o.Table
|
||||
useTableName = o.Table
|
||||
}
|
||||
return dbInstance.Table(tableName).Create(data).Error
|
||||
return dbInstance.Table(useTableName).Create(data).Error
|
||||
}
|
||||
|
||||
// Update 更新数据
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 8:12 下午 2021/8/8
|
||||
func (b *BaseDao) Update(dbInstance *gorm.DB, updateData any, optionFuncList ...define.SetOption) (int64, error) {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Update(dbInstance *gorm.DB, updateData any, optionFuncList ...define.SetOption) (int64, error) {
|
||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
||||
r := dbInstance.Updates(updateData)
|
||||
return r.RowsAffected, r.Error
|
||||
}
|
||||
|
||||
// UpdateOne 更新一条数据
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:05 2024/1/13
|
||||
func (b *BaseDao) UpdateOne(dbInstance *gorm.DB, updateData any, optionFuncList ...define.SetOption) (int64, error) {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) UpdateOne(dbInstance *gorm.DB, updateData any, optionFuncList ...define.SetOption) (int64, error) {
|
||||
optionFuncList = append(optionFuncList, WithLimit(1, 0))
|
||||
return b.Update(dbInstance, updateData, optionFuncList...)
|
||||
}
|
||||
|
||||
// List 查询数据列表
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 8:14 下午 2021/8/8
|
||||
func (b *BaseDao) List(dbInstance *gorm.DB, result any, optionFuncList ...define.SetOption) error {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) List(dbInstance *gorm.DB, result *[]DatabaseDataType, optionFuncList ...define.SetOption) error {
|
||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
||||
return dbInstance.Find(result).Error
|
||||
}
|
||||
|
||||
// ListAndTotal 同时查询数据列表和数据总数
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 16:04 2025/2/26
|
||||
func (b *BaseDao) ListAndTotal(dbInstance *gorm.DB, listRes any, totalRes *int64, disableTotal bool, optionFuncList ...define.SetOption) error {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) ListAndTotal(dbInstance *gorm.DB, listRes *[]DatabaseDataType, totalRes *int64, disableTotal bool, optionFuncList ...define.SetOption) error {
|
||||
var (
|
||||
err error
|
||||
)
|
||||
if err = b.receiverTypeValid(listRes); nil != err {
|
||||
return err
|
||||
}
|
||||
if err = b.receiverTypeValid(totalRes); nil != err {
|
||||
return err
|
||||
}
|
||||
|
||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
||||
if err = dbInstance.Find(listRes).Error; nil != err {
|
||||
@ -104,32 +88,20 @@ func (b *BaseDao) ListAndTotal(dbInstance *gorm.DB, listRes any, totalRes *int64
|
||||
}
|
||||
|
||||
// Delete 删除数据, 硬删除, 对应 delete语句
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 11:46 2023/2/9
|
||||
func (b *BaseDao) Delete(dbInstance *gorm.DB, dataModel any, optionFuncList ...define.SetOption) (int64, error) {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Delete(dbInstance *gorm.DB, dataModel *DatabaseDataType, optionFuncList ...define.SetOption) (int64, error) {
|
||||
dbInstance = dbInstance.Model(dataModel)
|
||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...).Delete(dataModel)
|
||||
return dbInstance.RowsAffected, dbInstance.Error
|
||||
}
|
||||
|
||||
// Detail 查询详情
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 8:25 下午 2021/8/8
|
||||
func (b *BaseDao) Detail(dbInstance *gorm.DB, result any, optionFuncList ...define.SetOption) error {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Detail(dbInstance *gorm.DB, result *DatabaseDataType, optionFuncList ...define.SetOption) error {
|
||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
||||
return dbInstance.First(result).Error
|
||||
}
|
||||
|
||||
// DetailByPrimaryID ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 14:14 2023/10/15
|
||||
func (b *BaseDao) DetailByPrimaryID(dbInstance *gorm.DB, result any, primaryID any, primaryKey ...string) error {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) DetailByPrimaryID(dbInstance *gorm.DB, result *DatabaseDataType, primaryID any, primaryKey ...string) error {
|
||||
primaryKeyField := "id"
|
||||
if len(primaryKey) > 0 {
|
||||
primaryKeyField = primaryKey[0]
|
||||
@ -140,20 +112,12 @@ func (b *BaseDao) DetailByPrimaryID(dbInstance *gorm.DB, result any, primaryID a
|
||||
}
|
||||
|
||||
// IsNotFound 增加结果是否为数据不存在的判断
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:57 2023/2/23
|
||||
func (b *BaseDao) IsNotFound(err error) bool {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) IsNotFound(err error) bool {
|
||||
return errors.Is(err, gorm.ErrRecordNotFound)
|
||||
}
|
||||
|
||||
// Count 查询数量
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 8:25 下午 2021/8/8
|
||||
func (b *BaseDao) Count(dbInstance *gorm.DB, optionFuncList ...define.SetOption) (int64, error) {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Count(dbInstance *gorm.DB, optionFuncList ...define.SetOption) (int64, error) {
|
||||
optionFuncList = append(optionFuncList, WithClearLimit())
|
||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
||||
var cnt int64
|
||||
@ -161,11 +125,7 @@ func (b *BaseDao) Count(dbInstance *gorm.DB, optionFuncList ...define.SetOption)
|
||||
}
|
||||
|
||||
// Tx 执行事务
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 20:31 2022/12/24
|
||||
func (b *BaseDao) Tx(dbInstance *gorm.DB, txFunc func(dbInstance *gorm.DB) error) error {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Tx(dbInstance *gorm.DB, txFunc func(dbInstance *gorm.DB) error) error {
|
||||
if nil == dbInstance {
|
||||
return errors.New("db instance is null")
|
||||
}
|
||||
@ -178,38 +138,22 @@ func (b *BaseDao) Tx(dbInstance *gorm.DB, txFunc func(dbInstance *gorm.DB) error
|
||||
}
|
||||
|
||||
// Begin 开启事务
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 3:09 下午 2021/8/9
|
||||
func (b *BaseDao) Begin(dbInstance *gorm.DB) *gorm.DB {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Begin(dbInstance *gorm.DB) *gorm.DB {
|
||||
return dbInstance.Begin()
|
||||
}
|
||||
|
||||
// Commit 提交事务
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 3:10 下午 2021/8/9
|
||||
func (b *BaseDao) Commit(db *gorm.DB) error {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Commit(db *gorm.DB) error {
|
||||
return db.Commit().Error
|
||||
}
|
||||
|
||||
// Rollback 回滚
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 3:12 下午 2021/8/9
|
||||
func (b *BaseDao) Rollback(db *gorm.DB) error {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Rollback(db *gorm.DB) error {
|
||||
return db.Rollback().Error
|
||||
}
|
||||
|
||||
// setTxCondition 设置查询条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:38 2022/5/15
|
||||
func (b *BaseDao) setTxCondition(inputTx *gorm.DB, optionFuncList ...define.SetOption) *gorm.DB {
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) setTxCondition(inputTx *gorm.DB, optionFuncList ...define.SetOption) *gorm.DB {
|
||||
// 构建查询条件
|
||||
o := &define.Option{}
|
||||
for _, fn := range optionFuncList {
|
||||
@ -225,7 +169,7 @@ func (b *BaseDao) setTxCondition(inputTx *gorm.DB, optionFuncList ...define.SetO
|
||||
if len(o.Table) > 0 {
|
||||
tx = tx.Table(o.Table)
|
||||
} else {
|
||||
tx = tx.Table(b.TableName)
|
||||
tx = tx.Table(b.tableName)
|
||||
}
|
||||
|
||||
if nil != o.Model {
|
||||
@ -283,6 +227,10 @@ func (b *BaseDao) setTxCondition(inputTx *gorm.DB, optionFuncList ...define.SetO
|
||||
tx = tx.Where(o.Where)
|
||||
}
|
||||
|
||||
if o.ForUpdate {
|
||||
tx = tx.Clauses(clause.Locking{Strength: "UPDATE"})
|
||||
}
|
||||
|
||||
// between
|
||||
for field, betweenVal := range o.Between {
|
||||
tx = tx.Where("`"+field+"` BETWEEN ? AND ?", betweenVal[0], betweenVal[1])
|
||||
@ -308,26 +256,45 @@ func (b *BaseDao) setTxCondition(inputTx *gorm.DB, optionFuncList ...define.SetO
|
||||
tx.Or(orSql, orBindVal)
|
||||
}
|
||||
}
|
||||
/*sqlBlockList := make([]string, 0)
|
||||
bindValueList := make([]any, 0)
|
||||
sql, bindVal := optionToSql(o)
|
||||
tx.Or(sql, bindVal...)
|
||||
sqlBlockList = append(sqlBlockList, sql)
|
||||
bindValueList = append(bindValueList, bindVal)
|
||||
for _, itemOrFuncList := range o.OR {
|
||||
orOption := &Option{}
|
||||
for _, fn := range itemOrFuncList {
|
||||
fn(orOption)
|
||||
}
|
||||
orSql, orBindVal := optionToSql(orOption)
|
||||
tx.Or(orSql, orBindVal...)
|
||||
}*/
|
||||
return tx
|
||||
}
|
||||
|
||||
func (b *BaseDao) receiverTypeValid(receiver any) error {
|
||||
if receiver == nil || reflect.TypeOf(receiver).Kind() != reflect.Ptr {
|
||||
return errors.New("receiver is nil or receiver is not a pointer")
|
||||
}
|
||||
return nil
|
||||
// TableName 获取数据表名
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) TableName() string {
|
||||
val := reflect.ValueOf(*new(DatabaseDataType)).MethodByName("TableName").Call(nil)[0]
|
||||
return val.Interface().(string)
|
||||
}
|
||||
|
||||
// ColumnComment 表字段注释
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) ColumnComment() map[string]string {
|
||||
if len(b.columnComment) > 0 {
|
||||
return b.columnComment
|
||||
}
|
||||
val := reflect.ValueOf(new(DatabaseDataType)).MethodByName("ColumnComment").Call(nil)[0]
|
||||
b.columnComment = val.Interface().(map[string]string)
|
||||
return b.columnComment
|
||||
}
|
||||
|
||||
// Columns 表字段枚举
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Columns() DatabaseTableColumns {
|
||||
if b.isSetColumns {
|
||||
return b.columns
|
||||
}
|
||||
b.columns = reflect.ValueOf(new(DatabaseDataType)).MethodByName("Columns").Call(nil)[0].Interface().(DatabaseTableColumns)
|
||||
b.isSetColumns = true
|
||||
return b.columns
|
||||
}
|
||||
|
||||
// DetailForAny 查询任意表数据详情
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) DetailForAny(tx *gorm.DB, tableName string, result any, optionList ...define.SetOption) error {
|
||||
tx = tx.Table(tableName)
|
||||
tx = b.setTxCondition(tx, optionList...)
|
||||
return tx.First(result).Error
|
||||
}
|
||||
|
||||
// ListForAny 查询任意表数据列表
|
||||
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) ListForAny(tx *gorm.DB, tableName string, data any, optionList ...define.SetOption) error {
|
||||
tx = tx.Table(tableName)
|
||||
tx = b.setTxCondition(tx, optionList...)
|
||||
return tx.Find(data).Error
|
||||
}
|
||||
|
||||
@ -34,6 +34,7 @@ type Option struct {
|
||||
Like map[string]string `json:"like"` // like 语句
|
||||
NotLike map[string]string `json:"not_like"` // not like 语句
|
||||
NotEqual map[string]any `json:"not_equal"` // != 语句
|
||||
ForUpdate bool `json:"for_update"` // 加互斥锁
|
||||
Order []string `json:"order"` // 排序规则
|
||||
OR [][]SetOption `json:"or"` // or 语句, or 和其他属性 and 关系, 内部 OR 关系
|
||||
}
|
||||
|
||||
20
go.mod
20
go.mod
@ -6,10 +6,10 @@ toolchain go1.24.2
|
||||
|
||||
require (
|
||||
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250916024308-d378e6c57772
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20250817142254-a501f79e7894
|
||||
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20240122104027-4928421213c0
|
||||
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20250504055908-8d68e6106ea9
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20250321102712-1cbfbe959740
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251031042950-416e962cbf3b
|
||||
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42
|
||||
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251014035305-c0ec06fa6dff
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2
|
||||
go.uber.org/zap v1.27.0
|
||||
@ -22,17 +22,17 @@ require (
|
||||
filippo.io/edwards25519 v1.1.0 // indirect
|
||||
git.zhangdeman.cn/zhangdeman/easylock v0.0.0-20230731062340-983985c12eda // indirect
|
||||
git.zhangdeman.cn/zhangdeman/easymap v0.0.0-20241101082529-28a6c68e38a4 // indirect
|
||||
git.zhangdeman.cn/zhangdeman/network v0.0.0-20250726060351-78810e906bfa // indirect
|
||||
git.zhangdeman.cn/zhangdeman/network v0.0.0-20251013095944-5b89fff39bde // indirect
|
||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e // indirect
|
||||
git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20241125101541-c5ea194c9c1e // indirect
|
||||
git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20251013144324-313024336a6f // indirect
|
||||
github.com/BurntSushi/toml v1.5.0 // indirect
|
||||
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 // indirect
|
||||
github.com/bytedance/gopkg v0.1.3 // indirect
|
||||
github.com/bytedance/sonic v1.14.1 // indirect
|
||||
github.com/bytedance/sonic/loader v0.3.0 // indirect
|
||||
github.com/bytedance/sonic v1.14.2 // indirect
|
||||
github.com/bytedance/sonic/loader v0.4.0 // indirect
|
||||
github.com/cloudwego/base64x v0.1.6 // indirect
|
||||
github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.10 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.11 // indirect
|
||||
github.com/gin-contrib/sse v1.1.0 // indirect
|
||||
github.com/gin-gonic/gin v1.11.0 // indirect
|
||||
github.com/go-ini/ini v1.67.0 // indirect
|
||||
@ -66,7 +66,7 @@ require (
|
||||
github.com/tidwall/match v1.2.0 // indirect
|
||||
github.com/tidwall/pretty v1.2.1 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/ugorji/go/codec v1.3.0 // indirect
|
||||
github.com/ugorji/go/codec v1.3.1 // indirect
|
||||
go.uber.org/mock v0.6.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/arch v0.22.0 // indirect
|
||||
|
||||
49
go.sum
49
go.sum
@ -8,18 +8,38 @@ git.zhangdeman.cn/zhangdeman/easymap v0.0.0-20241101082529-28a6c68e38a4 h1:s6d4b
|
||||
git.zhangdeman.cn/zhangdeman/easymap v0.0.0-20241101082529-28a6c68e38a4/go.mod h1:V4Dfg1v/JVIZGEKCm6/aehs8hK+Xow1dkL1yiQymXlQ=
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20250817142254-a501f79e7894 h1:7nT1CADIAO2lhikqM1lAFlwrJXa7gNaz5bcUB+LgAIE=
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20250817142254-a501f79e7894/go.mod h1:UKGSNWsDmf6pBrC3SuC+jR7/Lj30c6b72hZi8dI+Vp8=
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251012094811-1afd71fd8627 h1:chAmVCoiWMcrmm+AfvesrhnZH+3+6LZZb+8UDj/E36M=
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251012094811-1afd71fd8627/go.mod h1:SZsX6q88TdR5JHZenesYhOw1x386ikfs2MkchQmW8D8=
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251013144549-29cc7ca2481e h1:bfhEntAdt9UrB5A7UC50ts2VoAfEY+524EX9lDC7Q/M=
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251013144549-29cc7ca2481e/go.mod h1:e9YroNosH0QICXABs59RV0UWx8BcFEJQto61iV6f9lM=
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251031042950-416e962cbf3b h1:+ca511XlP+HoBa2zB/ERSIE6yTiqiXpsgqvs64kRAZA=
|
||||
git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251031042950-416e962cbf3b/go.mod h1:tlQR2nfdP291Lug+b3BSu0q+kTPoSVNRL5dPq2nv9zQ=
|
||||
git.zhangdeman.cn/zhangdeman/network v0.0.0-20250726060351-78810e906bfa h1:r3AK2EKbQ82ShC5+AjbE95sqm90CkpbzLpmoV3zok9Q=
|
||||
git.zhangdeman.cn/zhangdeman/network v0.0.0-20250726060351-78810e906bfa/go.mod h1:v0tMMfXvE4WyUxaRo1r/D20BAbMkT5QPLSW7XtgQOxo=
|
||||
git.zhangdeman.cn/zhangdeman/network v0.0.0-20251013095944-5b89fff39bde h1:+3zIOditaUwzSpl2ybM1PYN4OYTIKiemMBt+pNv3Yko=
|
||||
git.zhangdeman.cn/zhangdeman/network v0.0.0-20251013095944-5b89fff39bde/go.mod h1:Ewh0UYOqXxEh0khgHj9bDz1rbnd7cCCsJrcOTFX/8wg=
|
||||
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20240122104027-4928421213c0 h1:gUDlQMuJ4xNfP2Abl1Msmpa3fASLWYkNlqDFF/6GN0Y=
|
||||
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20240122104027-4928421213c0/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI=
|
||||
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42 h1:VjYrb4adud7FHeiYS9XA0B/tOaJjfRejzQAlwimrrDc=
|
||||
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI=
|
||||
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20250504055908-8d68e6106ea9 h1:/GLQaFoLb+ciHOtAS2BIyPNnf4O5ME3AC5PUaJY9kfs=
|
||||
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20250504055908-8d68e6106ea9/go.mod h1:ABJ655C5QenQNOzf7LjCe4sSB52CXvaWLX2Zg4uwDJY=
|
||||
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd h1:kTZOpR8iHx27sUufMWVYhDZx9Q4h80j7RWlaR8GIBiU=
|
||||
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd/go.mod h1:pLrQ63JICi81/3w2BrD26QZiu+IpddvEVfMJ6No3Xb4=
|
||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e h1:Q973S6CcWr1ICZhFI1STFOJ+KUImCl2BaIXm6YppBqI=
|
||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e/go.mod h1:VpPjBlwz8U+OxZuxzHQBv1aEEZ3pStH6bZvT21ADEbI=
|
||||
git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20241125101541-c5ea194c9c1e h1:YE2Gi+M03UDImIpWa3I7jzSesyfu2RL8x/4ONs5v0oE=
|
||||
git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20241125101541-c5ea194c9c1e/go.mod h1:L/7JugxKZL3JP9JP/XDvPAPz0FQXG1u181Su1+u/d1c=
|
||||
git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20251013144324-313024336a6f h1:InxNoLPHBLwCLblW0lsL2P1ZBYoUEzw9Yh+KNLt4Xmg=
|
||||
git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20251013144324-313024336a6f/go.mod h1:Pbs7tusW6RNcqrNCVcLE2zrM8JfPaO7lBJQuRiAzzLs=
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20250321102712-1cbfbe959740 h1:zPUoylfJTbc0EcxW+NEzOTBmoeFZ2I/rLFBnEzxb4Wk=
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20250321102712-1cbfbe959740/go.mod h1:1ct92dbVc49pmXusA/iGfcQUJzcYmJ+cjAhgc3sDv1I=
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251013091053-fa9097dc09fc h1:q+0ZRJ6NxhPHeBqzZPOt27RMuKvGJpwg37W9JdhKpjA=
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251013091053-fa9097dc09fc/go.mod h1:mBvTwcdqHRF3QIkAh92j/JRhru2LzyJ2LBqolxjzzKE=
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251013094128-d57d32b103be h1:mlmXacZHRKxmFmFKNFYRjZJ8+z2+QW3CH8L7AzoMTcQ=
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251013094128-d57d32b103be/go.mod h1:mBvTwcdqHRF3QIkAh92j/JRhru2LzyJ2LBqolxjzzKE=
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251014035305-c0ec06fa6dff h1:ym1Qs4diJe27CK/0K6vy7RvgH90mXgslWA++L8mXaKE=
|
||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251014035305-c0ec06fa6dff/go.mod h1:mBvTwcdqHRF3QIkAh92j/JRhru2LzyJ2LBqolxjzzKE=
|
||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
|
||||
@ -28,8 +48,12 @@ github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M
|
||||
github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=
|
||||
github.com/bytedance/sonic v1.14.1 h1:FBMC0zVz5XUmE4z9wF4Jey0An5FueFvOsTKKKtwIl7w=
|
||||
github.com/bytedance/sonic v1.14.1/go.mod h1:gi6uhQLMbTdeP0muCnrjHLeCUPyb70ujhnNlhOylAFc=
|
||||
github.com/bytedance/sonic v1.14.2 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE=
|
||||
github.com/bytedance/sonic v1.14.2/go.mod h1:T80iDELeHiHKSc0C9tubFygiuXoGzrkjKzX2quAx980=
|
||||
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
|
||||
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
||||
github.com/bytedance/sonic/loader v0.4.0 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2NYzevs+o=
|
||||
github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo=
|
||||
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
|
||||
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@ -40,10 +64,10 @@ github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1 h1:CaO/zOnF8VvUfEbhRatPcwKVWamvbY
|
||||
github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1/go.mod h1:+hnT3ywWDTAFrW5aE+u2Sa/wT555ZqwoCS+pk3p6ry4=
|
||||
github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0=
|
||||
github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
|
||||
github.com/gabriel-vasile/mimetype v1.4.11 h1:AQvxbp830wPhHTqc1u7nzoLT+ZFxGY7emj5DR5DYFik=
|
||||
github.com/gabriel-vasile/mimetype v1.4.11/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
|
||||
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
|
||||
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
|
||||
github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ=
|
||||
github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
||||
github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
|
||||
github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
|
||||
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
|
||||
@ -54,8 +78,6 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
|
||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||
github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
|
||||
github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
|
||||
github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0ktULL6FgHdG688=
|
||||
github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU=
|
||||
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
|
||||
@ -133,12 +155,15 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||
github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
|
||||
github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||
@ -151,6 +176,8 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
|
||||
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
||||
github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY=
|
||||
github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
||||
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 h1:zzrxE1FKn5ryBNl9eKOeqQ58Y/Qpo3Q9QNxKHX5uzzQ=
|
||||
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
@ -161,29 +188,19 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
|
||||
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
||||
golang.org/x/arch v0.21.0 h1:iTC9o7+wP6cPWpDWkivCvQFGAHDQ59SrSxsLPcnkArw=
|
||||
golang.org/x/arch v0.21.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=
|
||||
golang.org/x/arch v0.22.0 h1:c/Zle32i5ttqRXjdLyyHZESLD/bB90DCU1g9l/0YBDI=
|
||||
golang.org/x/arch v0.22.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=
|
||||
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
|
||||
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
|
||||
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
|
||||
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
|
||||
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
|
||||
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
|
||||
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
|
||||
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
|
||||
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
||||
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
||||
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
|
||||
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
|
||||
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
|
||||
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
|
||||
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
|
||||
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
|
||||
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
|
||||
@ -191,8 +208,6 @@ golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
|
||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
|
||||
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
|
||||
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
|
||||
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
|
||||
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
||||
@ -11,7 +11,7 @@ import (
|
||||
"fmt"
|
||||
|
||||
"git.zhangdeman.cn/zhangdeman/database/install/define"
|
||||
"git.zhangdeman.cn/zhangdeman/wrapper"
|
||||
"git.zhangdeman.cn/zhangdeman/wrapper/op_string"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -42,7 +42,7 @@ func (h *helper) NewPrimaryID(name string, comment string) *define.Field {
|
||||
Type: "BIGINT(20)",
|
||||
Unsigned: true,
|
||||
NotNull: true,
|
||||
DefaultValue: wrapper.String("0").ToStringPtr().Value,
|
||||
DefaultValue: op_string.ToBaseValuePtr[string]("0").Value,
|
||||
PrimaryKey: true,
|
||||
IsAutoIncrement: true,
|
||||
Comment: comment,
|
||||
@ -60,7 +60,7 @@ func (h *helper) NewBigintField(name string, unsigned bool, defaultVal string, c
|
||||
Type: "BIGINT(20)",
|
||||
Unsigned: unsigned,
|
||||
NotNull: true,
|
||||
DefaultValue: wrapper.String(defaultVal).ToStringPtr().Value,
|
||||
DefaultValue: op_string.ToBaseValuePtr[string](defaultVal).Value,
|
||||
PrimaryKey: false,
|
||||
IsAutoIncrement: false,
|
||||
Comment: comment,
|
||||
@ -78,7 +78,7 @@ func (h *helper) NewIntField(name string, unsigned bool, defaultVal string, comm
|
||||
Type: "INT(11)",
|
||||
Unsigned: unsigned,
|
||||
NotNull: true,
|
||||
DefaultValue: wrapper.String(defaultVal).ToStringPtr().Value,
|
||||
DefaultValue: op_string.ToBaseValuePtr[string](defaultVal).Value,
|
||||
PrimaryKey: false,
|
||||
IsAutoIncrement: false,
|
||||
Comment: comment,
|
||||
@ -96,7 +96,7 @@ func (h *helper) NewVarcharField(name string, length int, defaultVal string, com
|
||||
Type: fmt.Sprintf("VARCHAR(%v)", length),
|
||||
Unsigned: false,
|
||||
NotNull: true,
|
||||
DefaultValue: wrapper.String(defaultVal).ToStringPtr().Value,
|
||||
DefaultValue: op_string.ToBaseValuePtr[string](defaultVal).Value,
|
||||
PrimaryKey: false,
|
||||
IsAutoIncrement: false,
|
||||
Comment: comment,
|
||||
@ -114,7 +114,7 @@ func (h *helper) NewCharField(name string, length int, comment string, defaultVa
|
||||
Type: fmt.Sprintf("CHAR(%v)", length),
|
||||
Unsigned: false,
|
||||
NotNull: true,
|
||||
DefaultValue: wrapper.String(defaultVal).ToStringPtr().Value,
|
||||
DefaultValue: op_string.ToBaseValuePtr[string](defaultVal).Value,
|
||||
PrimaryKey: false,
|
||||
IsAutoIncrement: false,
|
||||
Comment: comment,
|
||||
@ -150,7 +150,7 @@ func (h *helper) NewTimestampField(name string, comment string, defaultVal strin
|
||||
Type: "TIMESTAMP",
|
||||
Unsigned: false,
|
||||
NotNull: true,
|
||||
DefaultValue: wrapper.String(defaultVal).ToStringPtr().Value,
|
||||
DefaultValue: op_string.ToBaseValuePtr[string](defaultVal).Value,
|
||||
PrimaryKey: false,
|
||||
IsAutoIncrement: false,
|
||||
Comment: comment,
|
||||
@ -168,7 +168,7 @@ func (h *helper) NewTimestampFieldWithUpdate(name string, comment string, defaul
|
||||
Type: "TIMESTAMP",
|
||||
Unsigned: false,
|
||||
NotNull: true,
|
||||
DefaultValue: wrapper.String(defaultVal).ToStringPtr().Value,
|
||||
DefaultValue: op_string.ToBaseValuePtr[string](defaultVal).Value,
|
||||
PrimaryKey: false,
|
||||
IsAutoIncrement: false,
|
||||
OnUpdate: "current_timestamp()",
|
||||
|
||||
176
logger/gorm_v2.go
Normal file
176
logger/gorm_v2.go
Normal file
@ -0,0 +1,176 @@
|
||||
// Package logger ...
|
||||
//
|
||||
// Description : logger ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2025-10-12 17:23
|
||||
package logger
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.zhangdeman.cn/zhangdeman/consts"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
"go.uber.org/zap/zapcore"
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
loggerPkg "git.zhangdeman.cn/zhangdeman/logger"
|
||||
"gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
// NewGormV2 获取日志实例
|
||||
func NewGormV2(loggerLevel loggerPkg.LogLevel, consoleOutput bool, encoder zapcore.Encoder, splitConfig *loggerPkg.RotateLogConfig, traceIDField string, skip int) (logger.Interface, error) {
|
||||
logConfList := []loggerPkg.SetLoggerOptionFunc{loggerPkg.WithEncoder(encoder), loggerPkg.WithCallerSkip(skip), loggerPkg.WithCaller()}
|
||||
if consoleOutput {
|
||||
logConfList = append(logConfList, loggerPkg.WithConsoleOutput())
|
||||
}
|
||||
|
||||
logInstance, err := loggerPkg.NewLogger(loggerLevel, splitConfig, logConfList...)
|
||||
if nil != err {
|
||||
return nil, err
|
||||
}
|
||||
if len(traceIDField) == 0 {
|
||||
traceIDField = "trace_id"
|
||||
}
|
||||
|
||||
return &Gorm{
|
||||
instance: logInstance,
|
||||
traceIDField: traceIDField,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NewGormLoggerWithInstance 获取gorm日志实现
|
||||
func NewGormLoggerWithInstance(outCtx context.Context, dbClient *gorm.DB, instance *zap.Logger, node string, extraCtxFieldList []string) logger.Interface {
|
||||
nodeArr := strings.Split(node, "|")
|
||||
i := &Gorm{
|
||||
dbClient: dbClient,
|
||||
instance: instance,
|
||||
traceIDField: consts.GinTraceIDField,
|
||||
extraCtxFieldList: extraCtxFieldList,
|
||||
flag: "",
|
||||
node: node,
|
||||
outCtx: outCtx,
|
||||
}
|
||||
if len(nodeArr) >= 2 {
|
||||
i.node = nodeArr[1]
|
||||
i.flag = nodeArr[0]
|
||||
}
|
||||
return i
|
||||
}
|
||||
|
||||
// Gorm v2 版本库日志实现
|
||||
type Gorm struct {
|
||||
dbClient *gorm.DB
|
||||
instance *zap.Logger // 日志实例
|
||||
traceIDField string // 串联请求上下文的的ID
|
||||
extraCtxFieldList []string // 从请求上线问提取的字段
|
||||
flag string // 数据库标识
|
||||
node string // 数据库节点 master / slave
|
||||
outCtx context.Context
|
||||
}
|
||||
|
||||
// LogMode ...
|
||||
func (g *Gorm) LogMode(level logger.LogLevel) logger.Interface {
|
||||
return g
|
||||
}
|
||||
|
||||
// Info 日志
|
||||
func (g *Gorm) Info(ctx context.Context, s string, i ...any) {
|
||||
g.write(ctx, s, consts.LogLevelInfo, map[string]any{
|
||||
"log_data": i,
|
||||
})
|
||||
}
|
||||
|
||||
// Warn ...
|
||||
func (g *Gorm) Warn(ctx context.Context, s string, i ...any) {
|
||||
g.write(ctx, s, consts.LogLevelWarn, map[string]any{
|
||||
"log_data": i,
|
||||
})
|
||||
}
|
||||
|
||||
// Error 日志
|
||||
func (g *Gorm) Error(ctx context.Context, s string, i ...any) {
|
||||
g.write(ctx, s, consts.LogLevelError, map[string]any{
|
||||
"log_data": i,
|
||||
})
|
||||
}
|
||||
|
||||
// Trace Trace 记录
|
||||
func (g *Gorm) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
|
||||
start := begin.UnixNano()
|
||||
end := time.Now().UnixNano()
|
||||
sql := ""
|
||||
affectRows := int64(0)
|
||||
if nil != fc {
|
||||
sql, affectRows = fc()
|
||||
}
|
||||
|
||||
logData := map[string]any{
|
||||
"db_flag": g.flag,
|
||||
"db_node": g.node,
|
||||
"begin_time": start,
|
||||
"finish_time": end,
|
||||
"used_time": (end - start) / 1e6,
|
||||
"sql": sql,
|
||||
"affect_rows": affectRows,
|
||||
"err": "",
|
||||
}
|
||||
if nil != err {
|
||||
logData["err"] = err.Error()
|
||||
}
|
||||
g.write(ctx, "SQL执行记录", consts.LogLevelInfo, logData)
|
||||
}
|
||||
|
||||
// write ...
|
||||
func (g *Gorm) write(ctx context.Context, message string, level consts.LogLevel, data map[string]any) {
|
||||
if len(message) == 0 {
|
||||
message = "SQL执行记录"
|
||||
}
|
||||
if nil == g.instance {
|
||||
// 未设置日志实例
|
||||
return
|
||||
}
|
||||
if nil == data {
|
||||
data = make(map[string]any)
|
||||
}
|
||||
if nil != data["sql"] {
|
||||
sqlStr := strings.TrimSpace(fmt.Sprintf("%v", data["sql"]))
|
||||
sqlArr := strings.Split(sqlStr, " ")
|
||||
if len(sqlArr) > 0 {
|
||||
data["sql_type"] = strings.ToUpper(sqlArr[0])
|
||||
}
|
||||
}
|
||||
if nil == g.outCtx {
|
||||
g.outCtx = context.Background()
|
||||
}
|
||||
|
||||
dataList := loggerPkg.NewLogData(g.outCtx, consts.LogTypeDatabase, "", data).ToFieldList()
|
||||
switch level {
|
||||
case consts.LogLevelDebug:
|
||||
g.instance.Debug(message, dataList...)
|
||||
case consts.LogLevelInfo:
|
||||
g.instance.Info(message, dataList...)
|
||||
case consts.LogLevelWarn:
|
||||
g.instance.Warn(message, dataList...)
|
||||
case consts.LogLevelError:
|
||||
g.instance.Error(message, dataList...)
|
||||
case consts.LogLevelPanic:
|
||||
g.instance.Panic(message, dataList...)
|
||||
default:
|
||||
g.instance.Info(message, dataList...)
|
||||
}
|
||||
}
|
||||
|
||||
// GetGormSQL 获取trace fn
|
||||
func GetGormSQL(dbClient *gorm.DB) func() (string, int64) {
|
||||
return func() (string, int64) {
|
||||
return dbClient.Dialector.Explain(dbClient.Statement.SQL.String(), dbClient.Statement.Vars...), dbClient.RowsAffected
|
||||
}
|
||||
}
|
||||
130
option.go
130
option.go
@ -11,19 +11,23 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"git.zhangdeman.cn/zhangdeman/consts"
|
||||
"git.zhangdeman.cn/zhangdeman/database/define"
|
||||
"git.zhangdeman.cn/zhangdeman/op_type"
|
||||
"git.zhangdeman.cn/zhangdeman/serialize"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// WithForUpdate 查询语句增加互斥锁
|
||||
func WithForUpdate(forUpdate bool) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
o.ForUpdate = forUpdate
|
||||
}
|
||||
}
|
||||
|
||||
// WithModel ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:18 2024/1/15
|
||||
func WithModel(model any) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
o.Model = model
|
||||
@ -31,10 +35,6 @@ func WithModel(model any) define.SetOption {
|
||||
}
|
||||
|
||||
// WithTable 设置查询的表名
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 20:56 2023/3/22
|
||||
func WithTable(tableName string) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
o.Table = tableName
|
||||
@ -42,10 +42,6 @@ func WithTable(tableName string) define.SetOption {
|
||||
}
|
||||
|
||||
// WithWhere 设置where条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 12:17 2022/5/15
|
||||
func WithWhere[T op_type.BaseType](where map[string]T) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.Where {
|
||||
@ -58,10 +54,6 @@ func WithWhere[T op_type.BaseType](where map[string]T) define.SetOption {
|
||||
}
|
||||
|
||||
// WithLimit 设置limit条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 12:00 2022/5/15
|
||||
func WithLimit[T op_type.Int](limit T, offset T) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
o.Limit = int(limit)
|
||||
@ -77,10 +69,6 @@ func WithClearLimit() define.SetOption {
|
||||
}
|
||||
|
||||
// WithLimitByPageAndSize 通过page和size构建条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 21:42 2023/10/14
|
||||
func WithLimitByPageAndSize[T op_type.Int](page T, size T) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if size > 0 {
|
||||
@ -94,10 +82,6 @@ func WithLimitByPageAndSize[T op_type.Int](page T, size T) define.SetOption {
|
||||
}
|
||||
|
||||
// WithIn 设置in条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 12:23 2022/5/15
|
||||
func WithIn[T op_type.Array](field string, value T) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == value {
|
||||
@ -113,11 +97,7 @@ func WithIn[T op_type.Array](field string, value T) define.SetOption {
|
||||
}
|
||||
}
|
||||
|
||||
// WithBatchIn ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 12:24 2022/5/15
|
||||
// WithBatchIn 批量设置IN条件
|
||||
func WithBatchIn[T op_type.Array](batchIn map[string]T) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.In {
|
||||
@ -130,10 +110,6 @@ func WithBatchIn[T op_type.Array](batchIn map[string]T) define.SetOption {
|
||||
}
|
||||
|
||||
// WithNotIn 设置 notin 条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 16:18 2022/5/15
|
||||
func WithNotIn[T op_type.Array](field string, value T) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.NotIn {
|
||||
@ -147,10 +123,6 @@ func WithNotIn[T op_type.Array](field string, value T) define.SetOption {
|
||||
}
|
||||
|
||||
// WithBatchNotIn 批量设置 NOT IN
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 16:23 2022/5/15
|
||||
func WithBatchNotIn[T op_type.Array](data map[string]T) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.NotIn {
|
||||
@ -166,10 +138,6 @@ func WithBatchNotIn[T op_type.Array](data map[string]T) define.SetOption {
|
||||
}
|
||||
|
||||
// WithStart >= 条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:01 2022/5/15
|
||||
func WithStart(field string, value any) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.Start {
|
||||
@ -180,10 +148,6 @@ func WithStart(field string, value any) define.SetOption {
|
||||
}
|
||||
|
||||
// WithBatchStart 批量设置起始条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:03 2022/5/15
|
||||
func WithBatchStart(data map[string]any) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.Start {
|
||||
@ -196,10 +160,6 @@ func WithBatchStart(data map[string]any) define.SetOption {
|
||||
}
|
||||
|
||||
// WithEnd 设置 < 条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:07 2022/5/15
|
||||
func WithEnd(field string, value any) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.End {
|
||||
@ -210,10 +170,6 @@ func WithEnd(field string, value any) define.SetOption {
|
||||
}
|
||||
|
||||
// WithBatchEnd 批量设置 < 条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:10 2022/5/15
|
||||
func WithBatchEnd(data map[string]any) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.End {
|
||||
@ -226,10 +182,6 @@ func WithBatchEnd(data map[string]any) define.SetOption {
|
||||
}
|
||||
|
||||
// WithLike 设置 like 查询条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:16 2022/5/15
|
||||
func WithLike(field string, value string) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.Like {
|
||||
@ -243,10 +195,6 @@ func WithLike(field string, value string) define.SetOption {
|
||||
}
|
||||
|
||||
// WithBatchLike 批量设置like条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:19 2022/5/15
|
||||
func WithBatchLike(data map[string]string) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.Like {
|
||||
@ -262,10 +210,6 @@ func WithBatchLike(data map[string]string) define.SetOption {
|
||||
}
|
||||
|
||||
// WithNotLike NOT LIKE 语句
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:50 2022/5/15
|
||||
func WithNotLike(field string, value string) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.NotLike {
|
||||
@ -279,10 +223,6 @@ func WithNotLike(field string, value string) define.SetOption {
|
||||
}
|
||||
|
||||
// WithBatchNotLike ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:52 2022/5/15
|
||||
func WithBatchNotLike(data map[string]string) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.NotLike {
|
||||
@ -298,10 +238,6 @@ func WithBatchNotLike(data map[string]string) define.SetOption {
|
||||
}
|
||||
|
||||
// WithNotEqual 设置不等于语句
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:31 2022/5/15
|
||||
func WithNotEqual[T op_type.BaseType](field string, value T) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.NotEqual {
|
||||
@ -312,10 +248,6 @@ func WithNotEqual[T op_type.BaseType](field string, value T) define.SetOption {
|
||||
}
|
||||
|
||||
// WithBatchNotEqual 批量设置不等于条件
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:33 2022/5/15
|
||||
func WithBatchNotEqual[T op_type.BaseType](data map[string]T) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.NotEqual {
|
||||
@ -328,10 +260,6 @@ func WithBatchNotEqual[T op_type.BaseType](data map[string]T) define.SetOption {
|
||||
}
|
||||
|
||||
// WithOR 设置OR语句
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 20:03 2022/7/23
|
||||
func WithOR(orConditionList ...define.SetOption) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.OR {
|
||||
@ -342,10 +270,6 @@ func WithOR(orConditionList ...define.SetOption) define.SetOption {
|
||||
}
|
||||
|
||||
// WithOrder 设置排序规则
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 20:15 2022/10/20
|
||||
func WithOrder(orderRuleList ...string) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if len(orderRuleList) != 2 {
|
||||
@ -364,28 +288,16 @@ func WithOrder(orderRuleList ...string) define.SetOption {
|
||||
}
|
||||
|
||||
// WithOrderDesc 降序排序
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:09 2023/4/3
|
||||
func WithOrderDesc(field string) define.SetOption {
|
||||
return WithOrder(field, "DESC")
|
||||
}
|
||||
|
||||
// WithOrderAsc 升序排序
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:09 2023/4/3
|
||||
func WithOrderAsc(field string) define.SetOption {
|
||||
return WithOrder(field, "ASC")
|
||||
}
|
||||
|
||||
// newOption 生成新的option
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:46 2024/8/9
|
||||
func newOption(setOptionList ...define.SetOption) *define.Option {
|
||||
o := &define.Option{}
|
||||
for _, item := range setOptionList {
|
||||
@ -395,10 +307,6 @@ func newOption(setOptionList ...define.SetOption) *define.Option {
|
||||
}
|
||||
|
||||
// optionToSql 基于 option 配置生成sql
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:46 2024/8/9
|
||||
func optionToSql(o *define.Option) (sqlBuildResult string, bindValue []any) {
|
||||
bindValue = make([]any, 0)
|
||||
sqlBuildResultBlockList := make([]string, 0)
|
||||
@ -486,10 +394,6 @@ func optionToSql(o *define.Option) (sqlBuildResult string, bindValue []any) {
|
||||
}
|
||||
|
||||
// parseInSql 解析in语句需要绑定占位符以及数据
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 22:07 2024/8/9
|
||||
func parseInSql(fieldValue any) (string, []any) {
|
||||
byteData, _ := json.Marshal(fieldValue)
|
||||
var dataList []any
|
||||
@ -505,10 +409,6 @@ func parseInSql(fieldValue any) (string, []any) {
|
||||
}
|
||||
|
||||
// WithBetween between 语句
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:52 2024/8/23
|
||||
func WithBetween(field string, left any, right any) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.Between {
|
||||
@ -519,10 +419,6 @@ func WithBetween(field string, left any, right any) define.SetOption {
|
||||
}
|
||||
|
||||
// WithNotBetween not between 语句
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:52 2024/8/23
|
||||
func WithNotBetween(field string, left any, right any) define.SetOption {
|
||||
return func(o *define.Option) {
|
||||
if nil == o.NotBetween {
|
||||
@ -533,10 +429,6 @@ func WithNotBetween(field string, left any, right any) define.SetOption {
|
||||
}
|
||||
|
||||
// WithAnyCondition 设置任意查询条件, 仅 where 子句 in / not in / like / not like / == / !=
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 14:48 2024/8/23
|
||||
func WithAnyCondition(column string, operate string, value any) (define.SetOption, error) {
|
||||
if nil == value {
|
||||
return nil, errors.New("value is nil")
|
||||
|
||||
@ -11,7 +11,7 @@ import (
|
||||
"errors"
|
||||
"strings"
|
||||
|
||||
wrapperType "git.zhangdeman.cn/zhangdeman/wrapper"
|
||||
"git.zhangdeman.cn/zhangdeman/wrapper/op_string"
|
||||
|
||||
"github.com/xwb1989/sqlparser"
|
||||
)
|
||||
@ -72,7 +72,7 @@ func ParseCreateTableSql(sql string) (*BasicTableInfo, error) {
|
||||
return nil, errors.New("input sql is not ddl")
|
||||
}
|
||||
basic.TableName = sqlparser.String(r.NewName)
|
||||
basic.ModelStructName = wrapperType.String(basic.TableName).SnakeCaseToCamel()
|
||||
basic.ModelStructName = op_string.SnakeCaseToCamel(basic.TableName)
|
||||
|
||||
// 生成model sql
|
||||
basic.ModelStruct = generateTable(basic.TableName, basic.ModelStructName, r.TableSpec.Columns)
|
||||
@ -103,7 +103,7 @@ func generateTable(tableName string, modelStructName string, columnList []*sqlpa
|
||||
comment = item.Name.String()
|
||||
}
|
||||
data := map[string]string{
|
||||
"{FIELD}": wrapperType.String(item.Name.String()).SnakeCaseToCamel(),
|
||||
"{FIELD}": op_string.SnakeCaseToCamel(item.Name.String()),
|
||||
"{COLUMN}": item.Name.String(),
|
||||
"{JSON_TAG}": item.Name.String(),
|
||||
"{DEFAULT_VALUE}": "",
|
||||
@ -169,7 +169,7 @@ func generateTableColumnDefined(modelStructName string, columnList []*sqlparser.
|
||||
comment = column.Name.String()
|
||||
}
|
||||
dataMap := map[string]string{
|
||||
"{FIELD}": wrapperType.String(column.Name.String()).SnakeCaseToCamel(),
|
||||
"{FIELD}": op_string.SnakeCaseToCamel(column.Name.String()),
|
||||
"{JSON_TAG}": column.Name.String(),
|
||||
"{FIELD_COMMENT}": comment,
|
||||
}
|
||||
|
||||
@ -11,24 +11,21 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"git.zhangdeman.cn/zhangdeman/consts"
|
||||
"git.zhangdeman.cn/zhangdeman/database/define"
|
||||
"git.zhangdeman.cn/zhangdeman/logger/wrapper"
|
||||
"git.zhangdeman.cn/zhangdeman/database/logger"
|
||||
"go.uber.org/zap"
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
gormLogger "gorm.io/gorm/logger"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// DBClient 包装日志实例
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 3:09 PM 2021/12/24
|
||||
type DBClient struct {
|
||||
DbFlag string // 数据库标识
|
||||
LoggerInstance *zap.Logger // 日志实例
|
||||
@ -42,10 +39,6 @@ type DBClient struct {
|
||||
}
|
||||
|
||||
// Init 初始化客户端
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:44 2024/8/20
|
||||
func (dc *DBClient) Init(databaseConfig *define.Database, cacheTableStructureConfig *define.CacheTableStructureConfig) error {
|
||||
dc.lock = &sync.RWMutex{}
|
||||
dc.cacheTableStructureConfig = cacheTableStructureConfig
|
||||
@ -76,10 +69,6 @@ func (dc *DBClient) Init(databaseConfig *define.Database, cacheTableStructureCon
|
||||
}
|
||||
|
||||
// GetMaster 获取主库连接
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 3:28 PM 2021/12/24
|
||||
func (dc *DBClient) GetMaster(ctx context.Context) *gorm.DB {
|
||||
session := dc.master.Session(&gorm.Session{})
|
||||
session.Logger = dc.getLogger(ctx, session, "master")
|
||||
@ -87,10 +76,6 @@ func (dc *DBClient) GetMaster(ctx context.Context) *gorm.DB {
|
||||
}
|
||||
|
||||
// GetSlave 获取从库链接
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 3:29 PM 2021/12/24
|
||||
func (dc *DBClient) GetSlave(ctx context.Context) *gorm.DB {
|
||||
session := dc.slave.Session(&gorm.Session{})
|
||||
session.Logger = dc.getLogger(ctx, session, "slave")
|
||||
@ -98,12 +83,8 @@ func (dc *DBClient) GetSlave(ctx context.Context) *gorm.DB {
|
||||
}
|
||||
|
||||
// getLogger 获取日志实例
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 3:45 PM 2021/12/24
|
||||
func (dc *DBClient) getLogger(ctx context.Context, dbClient *gorm.DB, node string) gormLogger.Interface {
|
||||
return wrapper.NewGormLoggerWithInstance(ctx, dbClient, dc.LoggerInstance, dc.DbFlag+"|"+node, dc.ExtraFieldList)
|
||||
return logger.NewGormLoggerWithInstance(ctx, dbClient, dc.LoggerInstance, dc.DbFlag+"|"+node, dc.ExtraFieldList)
|
||||
}
|
||||
|
||||
// GetDatabaseClient 获取数据库连接
|
||||
@ -142,16 +123,12 @@ func (dc *DBClient) GetDatabaseClient(conf *define.Driver, logInstance *zap.Logg
|
||||
}
|
||||
dbInstance.SetMaxIdleConns(conf.Connection.MaxIdle)
|
||||
dbInstance.SetMaxOpenConns(conf.Connection.MaxOpen)
|
||||
instance.Logger = wrapper.NewGormLoggerWithInstance(nil, instance, logInstance, "", nil)
|
||||
instance.Logger = logger.NewGormLoggerWithInstance(nil, instance, logInstance, "", nil)
|
||||
|
||||
return instance, nil
|
||||
}
|
||||
|
||||
// buildConnectionDSN 构建连接信息
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 18:42 2022/6/11
|
||||
func (dc *DBClient) buildConnectionDSN(conf *define.Driver) string {
|
||||
if conf.DBType == consts.DatabaseDriverSqlite3 {
|
||||
// 兼容sqlite3
|
||||
@ -170,10 +147,6 @@ func (dc *DBClient) buildConnectionDSN(conf *define.Driver) string {
|
||||
}
|
||||
|
||||
// CacheDataTableStructureConfig ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:03 2024/8/21
|
||||
func (dc *DBClient) CacheDataTableStructureConfig() *define.CacheTableStructureConfig {
|
||||
if nil == dc.cacheTableStructureConfig {
|
||||
return &define.CacheTableStructureConfig{Enable: false, SyncTimeInterval: 3600}
|
||||
@ -185,10 +158,6 @@ func (dc *DBClient) CacheDataTableStructureConfig() *define.CacheTableStructureC
|
||||
}
|
||||
|
||||
// GetTableFieldList 获取表结构配置
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:07 2024/8/21
|
||||
func (dc *DBClient) GetTableFieldList(tableName string) ([]*define.ColumnConfig, error) {
|
||||
if !dc.CacheDataTableStructureConfig().Enable {
|
||||
// 未启用缓存, 返回空list
|
||||
@ -203,10 +172,6 @@ func (dc *DBClient) GetTableFieldList(tableName string) ([]*define.ColumnConfig,
|
||||
}
|
||||
|
||||
// syncDbTableStructure 缓存表结构
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:17 2024/8/21
|
||||
func (dc *DBClient) syncDbTableStructure(ignoreErr bool) error {
|
||||
if !dc.CacheDataTableStructureConfig().Enable {
|
||||
// 自动同步不可用
|
||||
@ -256,10 +221,6 @@ func (dc *DBClient) syncDbTableStructure(ignoreErr bool) error {
|
||||
}
|
||||
|
||||
// SetTableStructure 设置表结构, 一旦调用人工设置, 则将终止自动同步
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 17:06 2024/8/23
|
||||
func (dc *DBClient) SetTableStructure(tableConfigTable map[string][]*define.ColumnConfig) {
|
||||
if nil != dc.cacheTableStructureConfig {
|
||||
// 关闭自动同步
|
||||
|
||||
Reference in New Issue
Block a user