实现数据库中表的复制
//存放复制表后新id与旧id映射
type CopyIDMap map[string]map[uint32]uint32
//存放传入需要修改的字段与值的映射
type CopyEnvMap map[string]interface{}
//定义接口
type ICopyTable interface {
TableName() string
GetCopyQuerySeter(ctx context.Context, copyEnvMap CopyEnvMap,copyIdMap CopyIDMap) ([]ICopyTable, error)
InsertCopyTable(ctx context.Context, copyEnvMap CopyEnvMap, copyIdMap CopyIDMap) error
setCopyIDMap(ctx context.Context, copyIdMap CopyIDMap, IDName string, oldId, newId uint32)
}
⚠️注意:map作为参数传入,全局统一,可以获取所有的map值
实现公用函数
不同结构实现某一个接口函数是相同的可以作为一个公共函数
type BaseCopyTable struct {
}
func (b *BaseCopyTable) setCopyIDMap(ctx context.Context, copyIdMap CopyIDMap, IDName string, oldId, newId uint32) {
if _, ok := copyIdMap[IDName]; !ok {
copyIdMap[IDName] = make(map[uint32]uint32)
}
copyIdMap[IDName][oldId] = uint32(newId)
}
具体的结构体
type App struct {
BaseCopyTable
Id uint32 `orm:"column(id)";pk`
AppKey string
AppSecret string
Name string
IsDeleted uint8
AutoCreateTime time.Time
AutoUpdateTime time.Time
}
⚠️注:结构体中含有匿名结构体,会把匿名结构体的具体结构包含到结构体中。结构体也会继承匿名结构体的方法。
实现复制的结构体
type BaseCopyApp struct {
appId uint32
appName string
copyTables []ICopyTable
copyEnvMap CopyEnvMap
CopyIDMap CopyIDMap
}
//创建对象
func newBaseCopyApp(ctx context.Context, appId uint32, appName string, copyTables []ICopyTable) *BaseCopyApp {
app := &BaseCopyApp{
appId: appId,
copyTables: copyTables,
copyEnvMap: CopyEnvMap{
"app_id": appId,
"app_name": appName,
},
CopyIDMap: CopyIDMap{},
}
return app
}
// 执行复制
func (c *BaseCopyApp) ExecCopy(ctx context.Context) (err error) {
db := libs.GetMysqlDb("document")
db.Begin()
defer func() {
if err == nil {
db.Commit()
} else {
db.Rollback()
}
}()
// 遍历每张需要复制的表
for _, copyTable := range c.copyTables {
// 获取查询结果
queryResultTables, e := copyTable.GetCopyQuerySeter(ctx, c.copyEnvMap,c.CopyIDMap)
if e != nil {
err = e
return err
}
// 执行复制
for _, queryResultTable := range queryResultTables {
e := queryResultTable.InsertCopyTable(ctx, c.copyEnvMap, c.CopyIDMap)
if e != nil {
err = e
return err
}
}
}
return
}
不同复制表,获取不同的对象
func NewCopyOcrTemplate(ctx context.Context, appId uint32, appName string) *BaseCopyApp {
copyTables := []ICopyTable{
&App{},
}
return newBaseCopyApp(ctx, appId, appName, copyTables)
}
⚠️注:interface{}可以接收各种类型,接收的都是interface类型
var test []interface{}
test = append(test,10)
如果interface是一个接口,所有实现interface的结构体也都是interface类型
var test interface{
TableName() string
}
type kk struct{
a int
}
func(k *kk)TableName() string{
return "kk"
}
testList := []test{
&kk{},
}