Documentation
¶
Overview ¶
Package daog, 是轻量级的数据库访问组件,它并不能称之为orm组件,仅仅提供了一组函数用以实现常用的数据库访问功能。 它是高性能的,与原生的使用sql包函数相比,没有性能损耗,这是因为,它并没有使用反射技术,而是使用编译技术把create table sql语句编译成daog需要的go代码。 它目前仅支持mysql。
设计思路来源于java的[orm框架sampleGenericDao](https://github.com/tiandarwin/simpleGenericDao)和protobuf的编译思路。之所以选择编译 而没有使用反射,是因为基于编译的抽象没有性能损耗。
Index ¶
- Constants
- func ConvertToAnySlice[T any](data []T) []any
- func Count[T any](tc *TransContext, m Matcher, meta *TableMeta[T]) (int64, error)
- func DeleteById[T any](tc *TransContext, id int64, meta *TableMeta[T]) (int64, error)
- func DeleteByIds[T any](tc *TransContext, ids []int64, meta *TableMeta[T]) (int64, error)
- func DeleteByMatcher[T any](tc *TransContext, matcher Matcher, meta *TableMeta[T]) (int64, error)
- func ExecRawSQL(tc *TransContext, sql string, args ...any) (int64, error)
- func GetAll[T any](tc *TransContext, meta *TableMeta[T], viewColumns ...string) ([]*T, error)
- func GetById[T any](tc *TransContext, id int64, meta *TableMeta[T], viewColumns ...string) (*T, error)
- func GetByIds[T any](tc *TransContext, ids []int64, meta *TableMeta[T], viewColumns ...string) ([]*T, error)
- func GetGoroutineIdFromContext(ctx context.Context) uint64
- func GetTableName[T any](ctx context.Context, meta *TableMeta[T]) string
- func GetTraceIdFromContext(ctx context.Context) string
- func Insert[T any](tc *TransContext, ins *T, meta *TableMeta[T]) (int64, error)
- func QueryListMatcher[T any](tc *TransContext, m Matcher, meta *TableMeta[T], orders ...*Order) ([]*T, error)
- func QueryListMatcherByBatchHandle[T any](tc *TransContext, m Matcher, meta *TableMeta[T], totalLimit int, batchSize int, ...) error
- func QueryListMatcherWithViewColumnsByBatchHandle[T any](tc *TransContext, m Matcher, meta *TableMeta[T], viewColumns []string, ...) error
- func QueryOneMatcher[T any](tc *TransContext, m Matcher, meta *TableMeta[T], viewColumns ...string) (*T, error)
- func QueryPageListMatcher[T any](tc *TransContext, m Matcher, meta *TableMeta[T], pager *Pager, ...) ([]*T, error)
- func QueryPageListMatcherWithViewColumns[T any](tc *TransContext, m Matcher, meta *TableMeta[T], viewColumns []string, ...) ([]*T, error)
- func QueryRawSQL[T any](tc *TransContext, extract ExtractScanFieldPoints[T], sql string, args ...any) ([]*T, error)
- func QueryRawSQLByBatchHandle[T any](tc *TransContext, batchSize int, handler BatchHandler[T], ...) error
- func Update[T any](tc *TransContext, ins *T, meta *TableMeta[T]) (int64, error)
- func UpdateById[T any](tc *TransContext, modifier Modifier, id int64, meta *TableMeta[T]) (int64, error)
- func UpdateByIds[T any](tc *TransContext, modifier Modifier, ids []int64, meta *TableMeta[T]) (int64, error)
- func UpdateByModifier[T any](tc *TransContext, modifier Modifier, matcher Matcher, meta *TableMeta[T]) (int64, error)
- func UpdateList[T any](tc *TransContext, insList []*T, meta *TableMeta[T]) (int64, error)
- func WrapTrans(tc *TransContext, workFn func(tc *TransContext) error) error
- func WrapTransWithResult[T any](tc *TransContext, workFn func(tc *TransContext) (T, error)) (T, error)
- type BatchHandler
- type Datasource
- type DatasourceShardingPolicy
- type DbConf
- type ExtractScanFieldPoints
- type Matcher
- type ModInt64ShardingDatasourcePolicy
- type Modifier
- type Order
- type OrdersBuilder
- type Pager
- type QuickDao
- type SQLCond
- type SQLLogger
- type TableMeta
- type TransContext
Constants ¶
const ( // LikeStyleAll ,like "%value%" LikeStyleAll = 0 // LikeStyleLeft ,like "%value" LikeStyleLeft = 1 // LikeStyleRight ,like "value%" LikeStyleRight = 2 )
define "and","or" operand define like style, %xx%, %s,s%
const TableIdColumnName = "id"
const (
TraceID = "trace-id"
)
Variables ¶
This section is empty.
Functions ¶
func ConvertToAnySlice ¶
ConvertToAnySlice 把泛型的slice转换成 any类型的slice,在应用系统的上层往往是泛型slice,通过强类型校验来防止出错, 但在sql driver底层需要 []any进行参数传递,二者不能被编译器自动转换,所以需要该函数来转换
func DeleteById ¶
DeleteById 根据主键id删除记录
参数: id 主键 , meta 表的元数据,由compile编译生成,比如 GroupInfo.GroupInfoMeta
返回值: 删除记录数,是否出错
func DeleteByIds ¶
DeleteByIds 根据主键id删除记录
参数: ids 一批主键 , meta 表的元数据,由compile编译生成,比如 GroupInfo.GroupInfoMeta
返回值: 删除记录数及是否出错
func DeleteByMatcher ¶
DeleteByMatcher 通过匹配条件删除数据,返回删除记录数及是否出错
func ExecRawSQL ¶
func ExecRawSQL(tc *TransContext, sql string, args ...any) (int64, error)
ExecRawSQL 执行原生的sql
func GetAll ¶ added in v0.0.8
func GetAll[T any](tc *TransContext, meta *TableMeta[T], viewColumns ...string) ([]*T, error)
GetAll 查询表的所有数据 可变参数 viewColumns:
可以指定需要查询的表字段,可以指定多个或者不指定,如果不指定表示要查询所有的表字段 需要注意的是,表字段指的是数据库表的列名,不是描述表的struct里的属性名 compile生成的文件中会有表字段的常量,比如 GroupInfo.go 文件中的 GroupInfoFields.Id, 直接使用它,避免手动写字符串
func GetById ¶
func GetById[T any](tc *TransContext, id int64, meta *TableMeta[T], viewColumns ...string) (*T, error)
GetById 根据指定的主键返回单条数据 可变参数 viewColumns:
可以指定需要查询的表字段,可以指定多个或者不指定,如果不指定表示要查询所有的表字段 需要注意的是,表字段指的是数据库表的列名,不是描述表的struct里的属性名 compile生成的文件中会有表字段的常量,比如 GroupInfo.go 文件中的 GroupInfoFields.Id, 直接使用它,避免手动写字符串
func GetByIds ¶
func GetByIds[T any](tc *TransContext, ids []int64, meta *TableMeta[T], viewColumns ...string) ([]*T, error)
GetByIds 根据主键数组返回多条数据 可变参数 viewColumns:
可以指定需要查询的表字段,可以指定多个或者不指定,如果不指定表示要查询所有的表字段 需要注意的是,表字段指的是数据库表的列名,不是描述表的struct里的属性名 compile生成的文件中会有表字段的常量,比如 GroupInfo.go 文件中的 GroupInfoFields.Id, 直接使用它,避免手动写字符串
func GetGoroutineIdFromContext ¶ added in v0.0.14
GetGoroutineIdFromContext 从 context.Context 中读取启动事务的 goroutine id
func GetTableName ¶
GetTableName 根据meta及上下文中的信息来确定表名称,这应用于分表的场景,记住这需要支持表shard的事务上下文
func GetTraceIdFromContext ¶
GetTraceIdFromContext 从 context.Context 中读取trace id
func Insert ¶
func Insert[T any](tc *TransContext, ins *T, meta *TableMeta[T]) (int64, error)
Insert 插入一条数据到表中,如果表有自增id,那么生成的id赋值到ins对象中
参数: ins 表实体对象,对应表的struct由 compile生成,比如 GroupInfo, meta 表的元数据,由compile编译生成,比如 GroupInfo.GroupInfoMeta
返回值: 插入的记录数,是否出错
func QueryListMatcher ¶
func QueryListMatcher[T any](tc *TransContext, m Matcher, meta *TableMeta[T], orders ...*Order) ([]*T, error)
QueryListMatcher 根据查询条件 Matcher 返回多条数据, 通过与 Matcher 有关的相关函数来构建查询条件 orders 可变参数:
可以传入一个、多个或者零个排序条件 每个条件可以指定排序表字段名及是否是升序要求
func QueryListMatcherByBatchHandle ¶ added in v0.0.4
func QueryListMatcherByBatchHandle[T any](tc *TransContext, m Matcher, meta *TableMeta[T], totalLimit int, batchSize int, handler BatchHandler[T], orders ...*Order) error
QueryListMatcherByBatchHandle 读取数据并且分批处理数据,当读取的数据量巨大时非常有用,如果数据都读入内存,容易打爆内存,分批量处理就非常有用 batchSize 每批处理数据的最大容量,必须大于0,但不要设置太大,当设置为1时,退化成每条处理 handler 用于处理每批数据的函数 查询数据最大上限数, 0 表示无上限
func QueryListMatcherWithViewColumnsByBatchHandle ¶ added in v0.0.4
func QueryListMatcherWithViewColumnsByBatchHandle[T any](tc *TransContext, m Matcher, meta *TableMeta[T], viewColumns []string, totalLimit int, batchSize int, handler BatchHandler[T], orders ...*Order) error
QueryListMatcherWithViewColumnsByBatchHandle 与 QueryListMatcherByBatchHandle 类似,适合分批读取少量数据并回调 BatchHandler 进行处理,与 QueryListMatcherByBatchHandle 稍有不同的是它提供 viewColumns 参数,可以只查询 viewColumns 指定的表字段 viewColumns 指定需要查询的表字段名,表示一个视图, 可以传入 nil, 表示读取所有字段
func QueryOneMatcher ¶
func QueryOneMatcher[T any](tc *TransContext, m Matcher, meta *TableMeta[T], viewColumns ...string) (*T, error)
QueryOneMatcher 通过 Matcher 条件来查询,但只返回单条数据 viewColumns 可以指定需要查询的表字段,可以指定多个或者不指定,如果不指定表示要查询所有的表字段
func QueryPageListMatcher ¶ added in v0.0.4
func QueryPageListMatcher[T any](tc *TransContext, m Matcher, meta *TableMeta[T], pager *Pager, orders ...*Order) ([]*T, error)
QueryPageListMatcher 根据查询条件 Matcher 及 Pager 返回一页数据, 通过与 Matcher 有关的相关函数来构建查询条件, 根据 Pager 相关函数来构建分页条件 orders 可变参数:
可以传入一个、多个或者零个排序条件 每个条件可以指定排序表字段名及是否是升序要求
pager 参数,可以为nil,如果为nil,不分页
func QueryPageListMatcherWithViewColumns ¶ added in v0.0.4
func QueryPageListMatcherWithViewColumns[T any](tc *TransContext, m Matcher, meta *TableMeta[T], viewColumns []string, pager *Pager, orders ...*Order) ([]*T, error)
QueryPageListMatcherWithViewColumns 根据查询条件 Matcher 及 Pager 返回一页数据, 通过与 Matcher 有关的相关函数来构建查询条件, 根据 Pager 相关函数来构建分页条件, viewColumns 指定需要查询的表字段名,表示一个视图 orders 可变参数:
可以传入一个、多个或者零个排序条件 每个条件可以指定排序表字段名及是否是升序要求
pager 参数,可以为nil,如果为nil,不分页
viewColumns 指定需要查询的表字段名,表示一个视图, 可以传入 nil, 表示读取所有字段
func QueryRawSQL ¶ added in v0.0.2
func QueryRawSQL[T any](tc *TransContext, extract ExtractScanFieldPoints[T], sql string, args ...any) ([]*T, error)
QueryRawSQL 执行原生select sql语句,返回行数据数组,行数据使用T struct描述 mapper, 它T的各个field指针提取出来并按照顺序生成一个slice,用于Row.Scan方法,把sql字段映射到T对象的各个Field上 sql 必须是含有 ? 占位符的sql, args 是对应每个 ? 的实参
func QueryRawSQLByBatchHandle ¶ added in v0.0.4
func QueryRawSQLByBatchHandle[T any](tc *TransContext, batchSize int, handler BatchHandler[T], extract ExtractScanFieldPoints[T], sql string, args ...any) error
QueryRawSQLByBatchHandle 与 QueryRawSQL 和 QueryListMatcherByBatchHandle 结合体,执行原生的sql语句,但通过回调 BatchHandler 进行分批业务处理 batchSize 每批处理数据的最大容量,必须大于0,但不要设置太大,当设置为1时,退化成每条处理 handler 用于处理每批数据的函数
func Update ¶
func Update[T any](tc *TransContext, ins *T, meta *TableMeta[T]) (int64, error)
Update 更新一条数据,把 *T类型的 ins 更新到数据,ins中的主键必须被设置 meta 表的元数据,由compile编译生成,比如 GroupInfo.GroupInfoMeta 返回值是 更新的数据的条数,是0或者1
func UpdateById ¶
func UpdateById[T any](tc *TransContext, modifier Modifier, id int64, meta *TableMeta[T]) (int64, error)
UpdateById 根据主键修改一条记录,需要修改的字段值通过 Modifier 指定
func UpdateByIds ¶
func UpdateByIds[T any](tc *TransContext, modifier Modifier, ids []int64, meta *TableMeta[T]) (int64, error)
UpdateByIds 根据多个主键修改多条记录,需要修改的字段值通过 Modifier 指定,表达 update table set a=?,b=? where id in(xx,xx)的语义
func UpdateByModifier ¶
func UpdateByModifier[T any](tc *TransContext, modifier Modifier, matcher Matcher, meta *TableMeta[T]) (int64, error)
UpdateByModifier 根据Matcher条件修改多条记录,需要修改的字段值通过 Modifier 指定,表达 update table set a=?,b=? where uid=? and status=0 的类似语义
func UpdateList ¶
func UpdateList[T any](tc *TransContext, insList []*T, meta *TableMeta[T]) (int64, error)
UpdateList 更新多条数据,把多个 *T类型的 ins 更新到数据,每个ins中的主键必须被设置 meta 表的元数据,由compile编译生成,比如 GroupInfo.GroupInfoMeta 返回值是 更新的数据的条数,是0或者1 注意: 当 tc 的事务类型是 txrequest.RequestNone 时,如果某一个 ins 更新失败,会立即返回错误,但该 ins之前的更新都会成功,此时的两个返回值都不是0值
func WrapTrans ¶ added in v0.0.9
func WrapTrans(tc *TransContext, workFn func(tc *TransContext) error) error
WrapTrans 在一个事务内执行所有的业务操作并最终根据err或者panic来判断是否提交事务。 如果不使用 WrapTrans 或者 WrapTransWithResult 你需要自行写一个defer 匿名函数用于最终提交或回滚事务,并且需要提前定义err变量,在业务执行过程中每个操作返回的err都需要赋值给err,而且每一步都需要判断err。如下:
var err error
tc,err := NewTransContext(...)
if err != nil {
return err
}
defer func() {
tc.CompleteWithPanic(err, recover())
}
err = run1(tc, ...)
if err != nil {
return err
}
err = run1(tc, ...)
if err != nil {
return err
}
return nil
func WrapTransWithResult ¶ added in v0.0.9
func WrapTransWithResult[T any](tc *TransContext, workFn func(tc *TransContext) (T, error)) (T, error)
WrapTransWithResult 与WrapTrans类似,不同的是业务处理函数可以有返回值
Types ¶
type BatchHandler ¶ added in v0.0.4
BatchHandler 处理一批从表中读取的数据的回调函数 被 QueryListMatcherByBatchHandle 或者 QueryListMatcherWithViewColumnsByBatchHandle 回调使用, 一般用于从数据库读取大量数据的场景, 如果大量数据读入内存会打爆内存,一批批的处理少量数据可以有效的降低内存
type Datasource ¶
type Datasource interface {
// Shutdown 关闭数据源
Shutdown()
// IsLogSQL 本数据源是否需要输出执行的sql到日志
IsLogSQL() bool
// contains filtered or unexported methods
}
Datasource 描述一个数据源,确切的说是一个数据源分片,它对应一个mysql database
func NewDatasource ¶
func NewDatasource(conf *DbConf) (Datasource, error)
NewDatasource 按照配置创建单个数据源对象
func NewShardingDatasource ¶
func NewShardingDatasource(confs []*DbConf, policy DatasourceShardingPolicy) (Datasource, error)
NewShardingDatasource 创建多分片数据源,创建好的数据源是复合数据源,内含confs参数指定的多个数据源,也包含一个分片策略, 使用 NewShardingDatasource 数据源时要求使用 NewTransContextWithSharding 来创建事务上下文
type DatasourceShardingPolicy ¶
type DatasourceShardingPolicy interface {
// Shard 根据分片key和分片总数来路由分片数据源
Shard(shardKey any, count int) (int, error)
}
DatasourceShardingPolicy 数据源分片策略
type DbConf ¶
type DbConf struct {
// 数据库url
DbUrl string
// 最大连接数
Size int
// 连接的最大生命周期,单位是秒
Life int
// 最大空闲连接数
IdleCons int
// 最大空闲时间,单位是秒
IdleTime int
// 该在该数据源上执行sql是是否需要把待执行的sql输出到日志
LogSQL bool
}
DbConf 数据源配置, 包括数据库url和连接池相关配置,特别注意,它支持按数据源在日志中输出执行的sql
type ExtractScanFieldPoints ¶ added in v0.0.3
ExtractScanFieldPoints 从指定的 *T 类型的对象中抽取出所需要的 field的指针,它是一个回调函数,用于 QueryRawSQL 或者 QueryRawSQLByBatchHandle 函数, 其目的是把从数据库读取的一行数据填充到指定 *T 对象中,这对于执行一个原生的 sql 非常有用。
type Matcher ¶
type Matcher interface {
SQLCond
// Add 这个方法是个冗余方法,其实可以直接使用AddCond, 因为Matcher继承自SQLCond,冗余这个方法仅仅是让使用者更好的理解
Add(matcher Matcher) Matcher
// AddCond 加入一个新的到条件
AddCond(cond SQLCond) Matcher
// Eq 快速生成一个等于语义的条件,比如 id = 100
// column 是数据库表的字段名,value是条件值
Eq(column string, value any) Matcher
// Ne 快速生成一个 not equals 条件语义, Eq 的反向
Ne(column string, value any) Matcher
// Lt 快速生成一个 less than 条件语义
Lt(column string, value any) Matcher
// Lte 快速生成一个 less than or equals 条件语义
Lte(column string, value any) Matcher
// Gt 快速生成一个greater than 条件语义
Gt(column string, value any) Matcher
// Gte 快速生成一个 greater than or equals 条件语义
Gte(column string, value any) Matcher
// In 快速生成in 条件语义,比如 xx in(?,?,...)
In(column string, values []any) Matcher
// NotIn 快速生成 not in 语义,比如 xx not in(?,?,...)
NotIn(column string, values []any) Matcher
// Like 快速生成 like 条件语义, 参数 likeStyle对应 枚举值: LikeStyleAll/ LikeStyleLeft / LikeStyleRight
Like(column string, value string, likeStyle int) Matcher
// Null 快速生成是否为空的条件语义,比如 name is null, 参数not表示是否为not null, 如果为true, 则生成条件 name is not null
Null(column string, not bool) Matcher
// Between 快速生成between 语义, start 和end可以有一个为 nil, 如果 start = nil,则退化成 column <= end, 如果 end = nil,则退化成 column >= end
// 两个都不为nil,生成标准的between语义
Between(column string, start any, end any) Matcher
// AddScalar 增加一个标量条件,即增加一个条件字符串,比如 "id = 100", 或者 "name = 'Joe'",
// 注意 尽量不要使用这个方法,因为它容易引起sql注入,如果你需要使用这个方法,你一定要使用转义来防止sql注入
AddScalar(cond string) Matcher
}
Matcher sql where条件的构建器,用以构造以 and 或者 or 连接的各种条件, 最后拼接生成一个可用的、包含?占位符的where条件,并且收集所有对应?的参数数组
type ModInt64ShardingDatasourcePolicy ¶
type ModInt64ShardingDatasourcePolicy int64
ModInt64ShardingDatasourcePolicy 分片key是int64直接对分片总数取模路由策略,这是最简单的方式
type Modifier ¶
type Modifier interface {
// Add 增加一个字段的修改,比如 id = 100
Add(column string, value any) Modifier
SelfAdd(column string, value any) Modifier
SelfMinus(column string, value any) Modifier
// contains filtered or unexported methods
}
Modifier 描述 update 语义中set cause的生成,通过 Modifier 来避免自己拼接sql片段,降低出错概率, 最终生成 update tab set xx=?,bb=? 的 sql 片段
type OrdersBuilder ¶ added in v0.0.8
type OrdersBuilder struct {
// contains filtered or unexported fields
}
OrdersBuilder 构建order by 条件工具
func NewOrdersBuilder ¶ added in v0.0.8
func NewOrdersBuilder() *OrdersBuilder
NewOrdersBuilder 构建 OrdersBuilder对象
func (*OrdersBuilder) Build ¶ added in v0.0.8
func (orders *OrdersBuilder) Build() []*Order
Build 构建出最终的 order by sql 片段
func (*OrdersBuilder) NewDescOrder ¶ added in v0.0.8
func (orders *OrdersBuilder) NewDescOrder(columnName string) *OrdersBuilder
NewDescOrder 增加一个降序的条件
func (*OrdersBuilder) NewOrder ¶ added in v0.0.8
func (orders *OrdersBuilder) NewOrder(columnName string) *OrdersBuilder
NewOrder 增加一个升序的条件
type QuickDao ¶ added in v0.0.3
type QuickDao[T any] interface { // GetAll 封装 GetAll 函数 GetAll(tc *TransContext, viewColumns ...string) ([]*T, error) // GetById 封装 GetById 函数 GetById(tc *TransContext, id int64, viewColumns ...string) (*T, error) // GetByIds 封装 GetByIds 函数 GetByIds(tc *TransContext, ids []int64, viewColumns ...string) ([]*T, error) // QueryListMatcher 封装 QueryListMatcher 函数 QueryListMatcher(tc *TransContext, m Matcher, orders ...*Order) ([]*T, error) // QueryPageListMatcher 封装 QueryPageListMatcher 函数 QueryPageListMatcher(tc *TransContext, m Matcher, pager *Pager, orders ...*Order) ([]*T, error) // QueryPageListMatcherWithViewColumns 封装 QueryPageListMatcherWithViewColumns 函数 QueryPageListMatcherWithViewColumns(tc *TransContext, m Matcher, viewColumns []string, pager *Pager, orders ...*Order) ([]*T, error) // QueryListMatcherByBatchHandle 封装 QueryListMatcherByBatchHandle 函数 QueryListMatcherByBatchHandle(tc *TransContext, m Matcher, totalLimit int, batchSize int, handler BatchHandler[T], orders ...*Order) error // QueryListMatcherWithViewColumnsByBatchHandle 封装 QueryListMatcherWithViewColumnsByBatchHandle 函数 QueryListMatcherWithViewColumnsByBatchHandle(tc *TransContext, m Matcher, viewColumns []string, totalLimit int, batchSize int, handler BatchHandler[T], orders ...*Order) error // QueryOneMatcher 封装 QueryOneMatcher 函数 QueryOneMatcher(tc *TransContext, m Matcher, viewColumns ...string) (*T, error) // QueryRawSQL 封装 QueryRawSQL 函数 QueryRawSQL(tc *TransContext, extract ExtractScanFieldPoints[T], sql string, args ...any) ([]*T, error) // QueryRawSQLByBatchHandle 封装 QueryRawSQLByBatchHandle 函数 QueryRawSQLByBatchHandle(tc *TransContext, batchSize int, handler BatchHandler[T], extract ExtractScanFieldPoints[T], sql string, args ...any) error // Count 封装 Count 函数 Count(tc *TransContext, m Matcher) (int64, error) // Insert 封装 Insert 函数 Insert(tc *TransContext, ins *T) (int64, error) // Update 封装 Update 函数 Update(tc *TransContext, ins *T) (int64, error) // UpdateList 封装 UpdateList 函数 UpdateList(tc *TransContext, insList []*T) (int64, error) // UpdateById 封装 UpdateById 函数 UpdateById(tc *TransContext, modifier Modifier, id int64) (int64, error) // UpdateByIds 封装 UpdateByIds 函数 UpdateByIds(tc *TransContext, modifier Modifier, ids []int64) (int64, error) // UpdateByModifier 封装 UpdateByModifier 函数 UpdateByModifier(tc *TransContext, modifier Modifier, matcher Matcher) (int64, error) // ExecRawSQL 封装 ExecRawSQL 函数 ExecRawSQL(tc *TransContext, sql string, args ...any) (int64, error) // DeleteById 封装 DeleteById 函数 DeleteById(tc *TransContext, id int64) (int64, error) // DeleteByIds 封装 DeleteByIds 函数 DeleteByIds(tc *TransContext, ids []int64) (int64, error) // DeleteByMatcher 封装 GetById 函数 DeleteByMatcher(tc *TransContext, matcher Matcher) (int64, error) }
QuickDao 类似于java的Dao接口,用于仅仅访问一张表。 针对每一张表生成一个实现 QuickDao 的struct的实例,使用这个实例来操作这张表。相对于直接调用诸如 GetAll 、 GetById 等函数可以少传入 TableMeta 对象,并且让代码看起来更面向对象。 针对每一张表的 QuickDao 不用自行实现, compile 会自动生成,比如 GroupInfo.go文件中GroupInfoDao
func NewBaseQuickDao ¶ added in v0.0.3
type SQLCond ¶
type SQLCond interface {
// ToSQL 生成包含?占位符的sql,并返回对应的参数数组
// 输入参数 args是已经收集到的参数
ToSQL(args []any) (string, []any, error)
}
SQLCond 抽象描述一个sql的条件,可以是 单个字段的条件,比如 name=?, 也可以是通过连接操作符(and/or)连接的多个条件。 每一个条件以 [字段 操作符 值占位符] 的方式组成,比如 id = ?,生成条件时需要传入每个占位符对应一个参数值 也可以直接给一个标量条件,没有参数,比如 status = 0
type SQLLogger ¶ added in v0.0.16
type SQLLogger interface {
// Error 输出错误日志
Error(ctx context.Context, err error)
// Info 输出 Info级别日志
Info(ctx context.Context, content string)
// ExecSQLBefore 在 sql 执行前输出它,这需要你在 构建数据源时指定的 DbConf.LogSQL = true
ExecSQLBefore(ctx context.Context, sql string, argsJson []byte, sqlMd5 string)
// ExecSQLAfter 在 sql 执行后输出它,这需要你在 构建数据源时指定的 DbConf.LogSQL = true
ExecSQLAfter(ctx context.Context, sqlMd5 string, cost int64)
// SimpleLogError 输出err,应用于你还没有构建 TransContext 前,此时 context.Context 还没有被初始化,对应err直接输出即可
SimpleLogError(err error)
}
SQLLogger 封装log类似与java slf4j的功能 输出日志时你可以调用 GetTraceIdFromContext 从 context.Context 读取到traceId,并在输出日志时输出它,当然,前题是你在 NewTransContext 时指定了traceId 你也可以调用 GetGoroutineIdFromContext 读取到调用 NewTransContext 的 goroutine 的 goroutine id, 并在日志中输出它
var GLogger SQLLogger = &defaultLogger{}
GLogger 全局的日志接口对象, 您可以实现自己 SQLLogger 对象并赋值给 GLogger, 则可以自行输出日志
type TableMeta ¶
type TableMeta[T any] struct { // 通过表的字段名称获取表实体对象中对应的field的值,或者该field的指针,取值一般用于insert or update, // 取指针一般用于从表中读取数据回填到表对象的field中,该函数会被compile自动生成 LookupFieldFunc func(columnName string, ins *T, point bool) any // 在分表情况下,根据分表key生成分表名称的回调函数,该函数不能被compile自动生成,需要使用者在compile生成的xx-ext.go中设置 ShardingFunc func(tableName string, shardingKey any) string Table string Columns []string // 自增长字段的名称,在insert时,表实体对象中对应的field会被自动填充 AutoColumn string }
TableMeta daog中需要表的元数据,基于元数据来自动生成sql,把从数据库读取的数据分配给表的实体对象,TableMeta对应的实例会由compile工具生成。 TableMeta 需要知道表名,表的列名,自增长字段名称,以及需要提供一个函数LookupFieldFunc,该函数负责根据表的字段名称找到该名称对应的属性。
func (*TableMeta[T]) ExtractFieldValues ¶
ExtractFieldValues 从给定的T对象中抽取属性值,并返回,抽取的属性值可能是属性指针,也可能是属性的值, 通过exclude可以指定哪些列对应的属性被排除,exclude 中key是数据库表的字段名,不是表实体对象中的属性名
type TransContext ¶
type TransContext struct {
LogSQL bool
// contains filtered or unexported fields
}
TransContext 事务的上下文,描述了数据事务,所有在该事务内执行的数据库操作都需要被提交或者回滚,保持原子性。在daog里要想执行数据库操作必须要确定TransContext, 他是数据操作的起点,一旦一个事务确定,对应的数据库连接确定,底层物理事务确定,同时它内部维护一个状态,用于记录事务的创建、提交/回滚, TransContext最终需要被调用 CompleteWithPanic 或者 Complete 来进入终态,进入终态后,其生命周期即完成
func NewTransContext ¶
func NewTransContext(datasource Datasource, txRequest txrequest.RequestStyle, traceId string) (*TransContext, error)
NewTransContext 创建一个单库单表的事务执行上下文
txRequest 指明了事务级别,事务级别参照 txrequest.RequestStyle
traceId 可以是nil,它代表一次业务请求,建议设置一个合理的值,它可以标记在执行的sql上,可以有效帮助排查问题
func NewTransContextWithSharding ¶
func NewTransContextWithSharding(datasource Datasource, txRequest txrequest.RequestStyle, traceId string, tableShardingKeyValue any, dsShardingKeyValue any) (*TransContext, error)
NewTransContextWithSharding 创建支持分库分表的事务上下文
tableShardingKeyValue 指定分表key,可以为nil,表示没有分表, 分表策略需要设置表的 TableMeta.ShardingFunc ,因为表的 TableMeta 是在编译成生成,TableMeta.ShardingFunc 推荐在 对应生成的 xx-ext.go中设置,比如 GroupInfo-ext.go
dsShardingKeyValue 指定数据库分片key, 可以为nil, 表示没有分片
func (*TransContext) Complete ¶
func (tc *TransContext) Complete(e error)
Complete 事务最终完成,可能是提交,也可能是会管,生命周期结束. e == nil, 提交事务,否则回滚
func (*TransContext) CompleteWithPanic ¶ added in v0.0.13
func (tc *TransContext) CompleteWithPanic(e error, fetal any)
CompleteWithPanic 事务最终完成,可能是提交,也可能是会管,生命周期结束. fetal参数指明它是否遇到了一个panic,fetal是对应recover()返回的信息 如果 fetal != nil 则回滚 否则 如果 e == nil 则提交 否则 回滚
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
json
command
|
|
|
Package ttypes 定义特殊类型支持,比如日期类型, golang的日期类型在转换成json时不能指定日期的格式,ttypes.NormalDate 可以按照 DateFormat指定的格式输出到json中或者fmt.Println.
|
Package ttypes 定义特殊类型支持,比如日期类型, golang的日期类型在转换成json时不能指定日期的格式,ttypes.NormalDate 可以按照 DateFormat指定的格式输出到json中或者fmt.Println. |
|
Package txrequest, 定义了事务的级别,包括三个级别:
|
Package txrequest, 定义了事务的级别,包括三个级别: |
|
Package utils, daog包使用的工具,现在只包含读取当前goroutine id的工具,未来可能会扩展
|
Package utils, daog包使用的工具,现在只包含读取当前goroutine id的工具,未来可能会扩展 |