daog

package module
v0.0.5 Latest Latest
Warning

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

Go to latest
Published: Feb 4, 2023 License: MIT Imports: 13 Imported by: 15

README

轻量、高性能

daog是轻量级的数据库访问组件,它并不能称之为orm组件,仅仅提供了一组函数用以实现常用的数据库访问功能。 它是高性能的,与原生的使用sql包函数相比,没有性能损耗,这是因为,它并没有使用反射技术,而是使用编译技术把create table sql语句编译成daog需要的go代码。 它目前仅支持mysql。

设计思路来源于java的orm框架sampleGenericDao和protobuf的编译思路。之所以选择编译 而没有使用反射,是因为基于编译的抽象没有性能损耗。

编译组件

compilex 是编译create table语句文件的工具,使用如下语句可以编译:

  ./compilex -i="sql file" -pkg packageName -o xxx/xx

编译完成后,把整个packageName文件夹copy到你的项目中即可。每一个表生成两个文件:

  • 主文件,以表名的驼峰格式命名,包含映射表的struct,和两个元数据对象,主文件不要修改
  • 扩展文件,以表名的驼峰格式+"-ext" 命名,这个文件可以修改,开发者可以自由扩展针对该表的数据访问功能。daog支持分表,分表函数需要在该文件的init函数中设置。

使用

核心概念

使用之前先要了解Datasource、TransContext、TableMeta

Datasource

数据源,用于描述一个mysql database,这儿的database指的是您使用create database创建出来的逻辑库。Datasource提供获链接、关闭库函数,也可以配置在改数据源上操作数据是否要输出执行sql日志。

  • 使用NewDatasource或NewShardingDatasource函数来创建Datasource对象
  • 数据库相关配置使用DbConf描述
TransContext

事务的执行上下文,所有的数据库操作都应该在一个数据上下文中执行,所有操作完成后必须调用Complete函数来结束事务上下文,一旦结束该上下文将不能再被使用。

  • 使用NewTransContext和NewTransContextWithSharding函数来创建事务上下文,二者的区别是是否支持分库分表,分库分表不必同时进行,可以只分库,也可以只分表,不需要的sharding Key传入nil即可。
  • 支持3中事务类型:没有事务、只读事务、写事务,txrequest包定义了对应的常量
  • 必须调用Complete方法来结束事务上下文,一般使用defer语句来结束事务上下文
TableMeta

go struct,用来描述数据表及对应go 对象信息信息,在go程序中一张数据库表需要对应的一个struct来描述,包括:

  • 表名及对应的struct的名称
  • 字段信息:字段名,对应struct的属性信息,数据类型信息
  • 用于根据字段名查找struct对象的属性值或者属性指针,采用该方法避免使用反射来为属性赋值,或者读取属性的值

每张表的TableMeta对象是通过compliex来生成的,无需手工创建

其他概念
Matcher

用于拼接sql条件的工具,直接进行字符串拼接往往会产生错误,而且错误只能在运行时被发现,提供工具来避免这种情况。 Matcher至支持多个条件组合.

  • Matcher内置了eq,like,between,gt,lt等过个快捷条件生成,支持组合新的Matcher,也支持您自己实现新的条件,直接实现 SQLCond接口即可。
  • 使用NewMatcher、NewAndMatcher、NewOrMatcher来创建对象
TableFields

这是逻辑概念,compilex会在每张表对应的主go文件中创建一个匿名struct对象。该对象记录了数据库的字段名称,以便于利用Matcher拼接sql

Modifier

顾名思义,用于update表字段,它描述了一组字段名与对应值对,用于拼接update语句

使用方式

daog提供了两种数据方式形式:

  • 直接使用daog提供的函数,比如:
func Insert[T any](tc *TransContextins *T, meta *TableMeta[T]) (int64, error) 
func QueryListMatcher[T any](tc *TransContext,m Matcher, meta *TableMeta[T]) ([]*T, error)
  • 使用QuickDao接口,该接口支持模板参数,每个编译好的主文件中都有类似GroupInfoDao的变量,该变量是QuickDao[GroupInfo]类型,包含一个实现QuickDao[GroupInfo]的匿名struct对象,可以直接使用它来操作数据库,相对于使用函数,它少传递了TableMeta对象

使用实例

可以参照代码的example

编译create table语句
create table group_info (
    id bigint(20) not null AUTO_INCREMENT primary key,
    `name` varchar(200) not null comment 'user name',
    main_data json not null,
    create_at datetime not null,
    total_amount decimal(10,2) not null
) ENGINE=innodb CHARACTER SET utf8mb4 comment 'group info';

编译出的主代码:

package dal

import (
	"github.com/rolandhe/daog"
	dbtime "github.com/rolandhe/daog/time"
	"github.com/shopspring/decimal"
)

var GroupInfoFields = struct {
	Id string
	Name string
	MainData string
	CreateAt string
	TotalAmount string

}{
	"id",
	"name",
	"main_data",
	"create_at",
	"total_amount",

}

var  GroupInfoMeta = &daog.TableMeta[GroupInfo]{
	InstanceFunc: func() *GroupInfo{
		return &GroupInfo{}
	},
	Table: "group_info",
	Columns: []string {
		"id",
		"name",
		"main_data",
		"create_at",
		"total_amount",

	},
	AutoColumn: "id",
	LookupFieldFunc: func(columnName string,ins *GroupInfo,point bool) any {
		if "id" == columnName {
			if point {
				return &ins.Id
			}
			return ins.Id
		}
		if "name" == columnName {
			if point {
				return &ins.Name
			}
			return ins.Name
		}
		if "main_data" == columnName {
			if point {
				return &ins.MainData
			}
			return ins.MainData
		}
		if "create_at" == columnName {
			if point {
				return &ins.CreateAt
			}
			return ins.CreateAt
		}
		if "total_amount" == columnName {
			if point {
				return &ins.TotalAmount
			}
			return ins.TotalAmount
		}

		return nil
	},
}

var GroupInfoDao daog.QuickDao[GroupInfo] = &struct {
	daog.QuickDao[GroupInfo]
}{
	daog.NewBaseQuickDao(GroupInfoMeta),
}

type GroupInfo struct {
	Id int64
	Name string
	MainData string
	CreateAt dbtime.NormalDatetime
	TotalAmount decimal.Decimal

}

copy到您的工程中

构建全局的Datasource对象
var datasource daog.Datasource

func init() {
	conf := &daog.DbConf{
		DbUrl:  "root:12345678@tcp(localhost:3306)/daog?parseTime=true&timeout=1s&readTimeout=2s&writeTimeout=2s",
		LogSQL: true,
	}
	var err error
	datasource, err = daog.NewDatasource(conf)
	if err != nil {
		log.Fatalln(err)
	}
}
构建事务上下文
// 构建写事务
tc, err := daog.NewTransContext(datasource, txrequest.RequestWrite, "trace-100099")
if err != nil {
    fmt.Println(err)
    return
}
// 构建读事务
tc, err := daog.NewTransContext(datasource, txrequest.RequestReadonly, "trace-100099")
if err != nil {
    fmt.Println(err)
    return
}

// 构建无事务
tc, err := daog.NewTransContext(datasource, txrequest.RequestNone, "trace-100099")
if err != nil {
    fmt.Println(err)
    return
}

函数模式
写表
func create() {
	tc, err := daog.NewTransContext(datasource, txrequest.RequestWrite, "trace-1001")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer func() {
		tc.Complete(err)
	}()
	amount, err := decimal.NewFromString("128.0")
	if err != nil {
		fmt.Println(err)
		return
	}
	t := &dal.GroupInfo{
		Name:        "roland",
		MainData:    `{"a":102}`,
		CreateAt:    dbtime.NormalDatetime(time.Now()),
		TotalAmount: amount,
	}
	affect, err := daog.Insert(tc,t, dal.GroupInfoMeta)
	fmt.Println(affect, t.Id, err)

	t.Name = "roland he"
	af, err := daog.Update(tc, t, dal.GroupInfoMeta)
	fmt.Println(af, err)
}
读取数据
func queryByIds() {
	tc, err := daog.NewTransContext(datasource, txrequest.RequestReadonly, "trace-1001")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer func() {
		tc.Complete(err)
	}()
	gs, err := daog.GetByIds(tc, []int64{1, 2}, dal.GroupInfoMeta)
	if err != nil {
		fmt.Println(err)
	}
	j, _ := json.Marshal(gs)
	fmt.Println("queryByIds", string(j))
	fmt.Println(gs)
}
根据Matcher读取
func queryByMatcher() {
	tc, err := daog.NewTransContext(datasource, txrequest.RequestNone, "trace-1001")
	if err != nil {
		fmt.Println(err)
		return
	}
	// 无事务情况下也需要加上这段代码,用于释放底层链接
	defer func() {
		tc.Complete(err)
	}()
	matcher := daog.NewMatcher().Eq(dal.GroupInfoFields.Name, "xiufeg").Lt(dal.GroupInfoFields.Id, 3)
	gs, err := daog.QueryListMatcher(tc, matcher, dal.GroupInfoMeta)
	if err != nil {
		fmt.Println(err)
	}
	j, _ := json.Marshal(gs)
	fmt.Println("queryByMatcher", string(j))
	fmt.Println(gs)
}
先读再写
func update() {
	tc, err := daog.NewTransContext(datasource, txrequest.RequestWrite, "trace-100099")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer func() {
		tc.Complete(err)
	}()
	g, err := daog.GetById(tc, 1, dal.GroupInfoMeta)
	if err != nil {
		fmt.Println(err)
	}
	j, _ := json.Marshal(g)
	fmt.Println("query", string(j))

	g.Name = "Eric"
	af, err := daog.Update(tc, g, dal.GroupInfoMeta)
	fmt.Println(af, err)
}
删除
func deleteById() {
	tc, err := daog.NewTransContext(datasource, txrequest.RequestWrite, "trace-1001")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer func() {
		tc.Complete(err)
	}()
	g, err := daog.DeleteById(tc, 2, dal.GroupInfoMeta)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("delete", g)
}
QuickDao接口模式

使用方式和函数模式非常类似,只是少传递TableMeta参数,以下以一个query示例来说明一下。

查询数据
func queryByIdsUsingDao() {
	tc, err := daog.NewTransContext(datasource, txrequest.RequestReadonly, "trace-1001")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer func() {
		tc.Complete(err)
	}()
	gs, err := dal.GroupInfoDao.GetByIds(tc,[]int64{1, 2})
	if err != nil {
		fmt.Println(err)
	}
	j, _ := json.Marshal(gs)
	fmt.Println("queryByIdsUsingDao", string(j))
	fmt.Println(gs)
}

其他

分库分表

daog缺省支持分表,您需要为每个表指定分表函数,这需要设置TableMeta.ShardingFunc,具体需要在编译出的-ext.go文件的init函数中设置。 daog缺省支持分库,分库策略需要您实现DatasourceShardingPolicy接口,并在NewShardingDatasource是传入。ModInt64ShardingDatasourcePolicy是一个简单实现。GetDatasourceShardingKeyFromCtx函数实现了从context.Context中读取datasource sharding key的能力。

日志输出

通过DbConf.LogSQL可以设置该数据源是否需要输出执行的sql及参数,可以为数据源指定,每个一个TransContext执行时会继承这个配置,您也可以设置 TransContext.LogSQL属性为每个事务上下文设置,更细粒度的控制日志输出。

日志的输出实现,缺省是调用标准库的log包,您也可以通过配置daog包的3个全局函数来修改:

  • LogError
  • LogInfo
  • LogExecSQLBefore
  • LogExecSQLAfter

GetTraceIdFromContext函数可以从context.Context中读取traceId

日期

golang的time.Time支持纳秒级别,但数据库支持秒级别即可,因此提供ttypes.NormalDate和ttypes.NormalDatetime来支持。 他们都内置了对json序列化的支持。序列化格式通过ttypes.DateFormat和ttypes.DatetimeFormat来设置,他们缺省是yyyy-MM-dd格式。

null字段值

golang sql包支持NullString, NullTime, NullFloat64, Nullxxx类型,但这些类型没有实现json序列化、反序列化接口。daog仅仅支持NullString和NullTime,其他的不支持, 这是因为实际的业务中,大部分情况要求字段是非空,尤其是数字数据类型。daog封装了NilableDate、NilableDatetime、NilableString三种类型,并提供一些函数用于简化开发,同时提供json序列化支持。

  • FromDatetime、FromDate、FromString函数用于把Time\string转换成Nilable对象;
  • NilableDate{},NilableDatetime{},NilableString{}表示null对象

Documentation

Overview

Package daog,A quickly mysql access component.

Copyright 2023 The daog Authors. All rights reserved.

Package daog,A quickly mysql access component.

Copyright 2023 The daog Authors. All rights reserved.

Package daog,A quickly mysql access component.

Copyright 2023 The daog Authors. All rights reserved.

Package daog,A quickly mysql access component.

Copyright 2023 The daog Authors. All rights reserved.

Package daog,A quickly mysql access component.

Copyright 2023 The daog Authors. All rights reserved.

Package daog,A quickly mysql access component.

Copyright 2023 The daog Authors. All rights reserved.

Package daog,A quickly mysql access component.

Copyright 2023 The daog Authors. All rights reserved.

Package daog,A quickly mysql access component.

Copyright 2023 The daog Authors. All rights reserved.

Package daog,A quickly mysql access component.

Copyright 2023 The daog Authors. All rights reserved.

Index

Constants

View Source
const (
	LikeStyleAll   = 0
	LikeStyleLeft  = 1
	LikeStyleRight = 2
)

define "and","or" operand define like style, %xx%, %s,s%

View Source
const (
	TraceId               = "trace-id"
	GoId                  = "goroutine-id"
	CtxValues             = "values"
	ShardingKey           = "shardingKey"
	DatasourceShardingKey = "datasourceSharingKey"
)
View Source
const TableIdColumnName = "id"

Variables

View Source
var (
	LogError         LogErrorFunc
	LogInfo          LogInfoFunc
	LogExecSQLBefore LogExecSQLBeforeFunc
	LogExecSQLAfter  LogExecSQLAfterFunc

	SimpleLogError func(err error)
)

Functions

func CompleteTransContext added in v0.0.4

func CompleteTransContext(tc *TransContext, e error)

func ConvertToAnySlice

func ConvertToAnySlice[T any](data []T) []any

func Count added in v0.0.4

func Count[T any](tc *TransContext, m Matcher, meta *TableMeta[T]) (int64, error)

func DeleteById

func DeleteById[T any](tc *TransContext, id int64, meta *TableMeta[T]) (int64, error)

func DeleteByIds

func DeleteByIds[T any](tc *TransContext, ids []int64, meta *TableMeta[T]) (int64, error)

func DeleteByMatcher

func DeleteByMatcher[T any](tc *TransContext, matcher Matcher, meta *TableMeta[T]) (int64, error)

func ExecRawSQL

func ExecRawSQL(tc *TransContext, sql string, args ...any) (int64, error)

func GetById

func GetById[T any](tc *TransContext, id int64, meta *TableMeta[T], viewColumns ...string) (*T, error)

func GetByIds

func GetByIds[T any](tc *TransContext, ids []int64, meta *TableMeta[T], viewColumns ...string) ([]*T, error)

func GetDatasourceShardingKeyFromCtx

func GetDatasourceShardingKeyFromCtx(ctx context.Context) any

func GetGoRoutineIdFromContext added in v0.0.4

func GetGoRoutineIdFromContext(ctx context.Context) uint64

func GetTableName

func GetTableName[T any](ctx context.Context, meta *TableMeta[T]) string

func GetTableShardingKeyFromCtx

func GetTableShardingKeyFromCtx(ctx context.Context) any

func GetTraceIdFromContext

func GetTraceIdFromContext(ctx context.Context) string

func Insert

func Insert[T any](tc *TransContext, ins *T, meta *TableMeta[T]) (int64, error)

func QueryListMatcher

func QueryListMatcher[T any](tc *TransContext, m Matcher, meta *TableMeta[T], orders ...*Order) ([]*T, error)

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

func QueryOneMatcher

func QueryOneMatcher[T any](tc *TransContext, m Matcher, meta *TableMeta[T], viewColumns ...string) (*T, error)

func QueryPageListMatcher added in v0.0.4

func QueryPageListMatcher[T any](tc *TransContext, m Matcher, meta *TableMeta[T], pager *Pager, orders ...*Order) ([]*T, error)

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)

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上

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

func Update

func Update[T any](tc *TransContext, ins *T, meta *TableMeta[T]) (int64, error)

func UpdateById

func UpdateById[T any](tc *TransContext, modifier Modifier, id int64, meta *TableMeta[T]) (int64, error)

func UpdateByIds

func UpdateByIds[T any](tc *TransContext, modifier Modifier, ids []int64, meta *TableMeta[T]) (int64, error)

func UpdateByModifier

func UpdateByModifier[T any](tc *TransContext, modifier Modifier, matcher Matcher, meta *TableMeta[T]) (int64, error)

func UpdateList

func UpdateList[T any](tc *TransContext, insList []*T, meta *TableMeta[T]) (int64, error)

Types

type BatchHandler added in v0.0.4

type BatchHandler[T any] func(batch []*T) error

type Datasource

type Datasource interface {
	Shutdown()
	IsLogSQL() bool
	// contains filtered or unexported methods
}

func NewDatasource

func NewDatasource(conf *DbConf) (Datasource, error)

func NewShardingDatasource

func NewShardingDatasource(confs []*DbConf, policy DatasourceShardingPolicy) (Datasource, error)

type DatasourceShardingPolicy

type DatasourceShardingPolicy interface {
	Shard(shardKey any, count int) (int, error)
}

type DbConf

type DbConf struct {
	DbUrl    string
	Size     int
	Life     int
	IdleCons int
	IdleTime int
	LogSQL   bool
}

type ExtractScanFieldPoints added in v0.0.3

type ExtractScanFieldPoints[T any] func(ins *T) []any

type LogErrorFunc

type LogErrorFunc func(ctx context.Context, err error)

type LogExecSQLAfterFunc

type LogExecSQLAfterFunc func(ctx context.Context, sqlMd5 string, cost int64)

type LogExecSQLBeforeFunc added in v0.0.3

type LogExecSQLBeforeFunc func(ctx context.Context, sql string, argsJson []byte, sqlMd5 string)

type LogInfoFunc

type LogInfoFunc func(ctx context.Context, content string)

type Matcher

type Matcher interface {
	SQLCond
	// Add 这个方法是个冗余方法,其实可以直接使用AddCond, 因为Matcher继承自SQLCond,冗余这个方法仅仅是让使用者更好的理解
	Add(matcher Matcher) Matcher
	AddCond(cond SQLCond) Matcher
	// Eq equals 语义
	Eq(column string, value any) Matcher
	// Ne  not equals 语义
	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 xx in(?,?,...)
	In(column string, values []any) Matcher
	// NotIn xx not in(?,?,...)
	NotIn(column string, values []any) Matcher
	Like(column string, value string, likeStyle int) Matcher
	Null(column string, not bool) Matcher
	Between(column string, start any, end any) Matcher
}

func NewAndMatcher

func NewAndMatcher() Matcher

func NewMatcher

func NewMatcher() Matcher

func NewOrMatcher

func NewOrMatcher() Matcher

type ModInt64ShardingDatasourcePolicy

type ModInt64ShardingDatasourcePolicy int64

func (ModInt64ShardingDatasourcePolicy) Shard

func (h ModInt64ShardingDatasourcePolicy) Shard(shardKey any, count int) (int, error)

type Modifier

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

func (*Modifier) Add

func (m *Modifier) Add(column string, value any) *Modifier

type Order added in v0.0.4

type Order struct {
	ColumnName string
	Desc       bool
}

func NewDescOrder added in v0.0.4

func NewDescOrder(columnName string) *Order

func NewOrder added in v0.0.4

func NewOrder(columnName string) *Order

type Orders added in v0.0.4

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

func (*Orders) Build added in v0.0.4

func (orders *Orders) Build() []*Order

func (*Orders) NewDescOrder added in v0.0.4

func (orders *Orders) NewDescOrder(columnName string) *Orders

func (*Orders) NewOrder added in v0.0.4

func (orders *Orders) NewOrder(columnName string) *Orders

type Pager added in v0.0.4

type Pager struct {
	PageSize   int
	PageNumber int
}

Pager 分页参数结构,PageSize 每一页的大小,PageNumber 页码,从0算起

func NewPager added in v0.0.4

func NewPager(pageSize int, pageNumber int) *Pager

type QuickDao added in v0.0.3

type QuickDao[T any] interface {
	GetById(tc *TransContext, id int64, viewColumns ...string) (*T, error)
	GetByIds(tc *TransContext, ids []int64, viewColumns ...string) ([]*T, error)
	QueryListMatcher(tc *TransContext, m Matcher, orders ...*Order) ([]*T, error)
	QueryPageListMatcher(tc *TransContext, m Matcher, pager *Pager, orders ...*Order) ([]*T, error)
	QueryPageListMatcherWithViewColumns(tc *TransContext, m Matcher, viewColumns []string, pager *Pager, orders ...*Order) ([]*T, error)
	QueryListMatcherByBatchHandle(tc *TransContext, m Matcher, totalLimit int, batchSize int, handler BatchHandler[T], orders ...*Order) error
	QueryListMatcherWithViewColumnsByBatchHandle(tc *TransContext, m Matcher, viewColumns []string, totalLimit int, batchSize int, handler BatchHandler[T], orders ...*Order) error
	QueryOneMatcher(tc *TransContext, m Matcher, viewColumns ...string) (*T, error)
	QueryRawSQL(tc *TransContext, extract ExtractScanFieldPoints[T], sql string, args ...any) ([]*T, error)
	QueryRawSQLByBatchHandle(tc *TransContext, batchSize int, handler BatchHandler[T], extract ExtractScanFieldPoints[T], sql string, args ...any) error
	Count(tc *TransContext, m Matcher) (int64, error)

	Insert(tc *TransContext, ins *T) (int64, error)

	Update(tc *TransContext, ins *T) (int64, error)
	UpdateList(tc *TransContext, insList []*T) (int64, error)
	UpdateById(tc *TransContext, modifier Modifier, id int64) (int64, error)
	UpdateByIds(tc *TransContext, modifier Modifier, ids []int64) (int64, error)
	UpdateByModifier(tc *TransContext, modifier Modifier, matcher Matcher) (int64, error)
	ExecRawSQL(tc *TransContext, sql string, args ...any) (int64, error)

	DeleteById(tc *TransContext, id int64) (int64, error)
	DeleteByIds(tc *TransContext, ids []int64) (int64, error)
	DeleteByMatcher(tc *TransContext, matcher Matcher) (int64, error)
}

func NewBaseQuickDao added in v0.0.3

func NewBaseQuickDao[T any](meta *TableMeta[T]) QuickDao[T]

type SQLCond

type SQLCond interface {
	ToSQL(args []any) (string, []any)
}

type TableMeta

type TableMeta[T any] struct {
	LookupFieldFunc func(columnName string, ins *T, point bool) any
	ShardingFunc    func(tableName string, shardingKey any) string
	Table           string
	Columns         []string
	AutoColumn      string
}

func (*TableMeta[T]) ExtractFieldValues

func (meta *TableMeta[T]) ExtractFieldValues(ins *T, point bool, exclude map[string]int) []any

func (*TableMeta[T]) ExtractFieldValuesByColumns added in v0.0.4

func (meta *TableMeta[T]) ExtractFieldValuesByColumns(ins *T, point bool, columns []string) []any

type TransContext

type TransContext struct {
	LogSQL bool
	// contains filtered or unexported fields
}

func NewTransContext

func NewTransContext(datasource Datasource, txRequest txrequest.RequestStyle, traceId string) (*TransContext, error)

func NewTransContextWithSharding

func NewTransContextWithSharding(datasource Datasource, txRequest txrequest.RequestStyle, traceId string, shardingKey any, datasourceShardingKey any) (*TransContext, error)

func (*TransContext) Complete

func (tc *TransContext) Complete(e error)

Directories

Path Synopsis
dal
json command
Package ttypes,A quickly mysql access component.
Package ttypes,A quickly mysql access component.
Package txrequest,A quickly mysql access component.
Package txrequest,A quickly mysql access component.

Jump to

Keyboard shortcuts

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