Files
mayfly-go/server/internal/db/dbm/dm/dialect.go
meilin.huang e56788af3e refactor: dbm
2024-12-08 13:04:23 +08:00

69 lines
1.8 KiB
Go

package dm
import (
"fmt"
"mayfly-go/internal/db/dbm/dbi"
"mayfly-go/pkg/utils/stringx"
"strings"
"time"
_ "gitee.com/chunanyong/dm"
)
type DMDialect struct {
dbi.DefaultDialect
dc *dbi.DbConn
}
func (dd *DMDialect) CopyTable(copy *dbi.DbCopyTable) error {
tableName := copy.TableName
metadata := dd.dc.GetMetadata()
ddl, err := metadata.GetTableDDL(tableName, false)
if err != nil {
return err
}
// 生成新表名,为老表明+_copy_时间戳
newTableName := tableName + "_copy_" + time.Now().Format("20060102150405")
// 替换新表名
ddl = strings.ReplaceAll(ddl, fmt.Sprintf("\"%s\"", strings.ToUpper(tableName)), fmt.Sprintf("\"%s\"", strings.ToUpper(newTableName)))
// 去除空格换行
ddl = stringx.TrimSpaceAndBr(ddl)
// sqls, err := sqlparser.SplitStatementToPieces(ddl, sqlparser.WithDialect(dd.dc.GetMetaData().GetSqlParserDialect()))
sqls := strings.Split(ddl, ";")
for _, sql := range sqls {
_, _ = dd.dc.Exec(sql)
}
// 复制数据
if copy.CopyData {
go func() {
// 设置允许填充自增列之后,显示指定列名可以插入自增列\
identityInsert := fmt.Sprintf("set identity_insert \"%s\" on", newTableName)
// 获取列名
columns, _ := metadata.GetColumns(tableName)
columnArr := make([]string, 0)
for _, column := range columns {
columnArr = append(columnArr, fmt.Sprintf("\"%s\"", column.ColumnName))
}
columnStr := strings.Join(columnArr, ",")
// 插入新数据并显示指定列
_, _ = dd.dc.Exec(fmt.Sprintf("%s insert into \"%s\" (%s) select %s from \"%s\"", identityInsert, newTableName, columnStr, columnStr, tableName))
}()
}
return err
}
func (dd *DMDialect) GetDumpHelper() dbi.DumpHelper {
return new(DumpHelper)
}
func (sd *DMDialect) GetSQLGenerator() dbi.SQLGenerator {
return &SQLGenerator{
Dialect: sd,
Metadata: sd.dc.GetMetadata(),
}
}