mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 08:20:25 +08:00 
			
		
		
		
	refactor: dbms优化
This commit is contained in:
		@@ -10,6 +10,8 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type MysqlDialect struct {
 | 
			
		||||
	dbi.DefaultDialect
 | 
			
		||||
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -76,31 +78,30 @@ func (md *MysqlDialect) CopyTable(copy *dbi.DbCopyTable) error {
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MysqlDialect) TransColumns(columns []dbi.Column) []dbi.Column {
 | 
			
		||||
	var commonColumns []dbi.Column
 | 
			
		||||
	for _, column := range columns {
 | 
			
		||||
		// 取出当前数据库类型
 | 
			
		||||
		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
		ctype := arr[0]
 | 
			
		||||
		// 翻译为通用数据库类型
 | 
			
		||||
		t1 := commonColumnTypeMap[ctype]
 | 
			
		||||
		if t1 == "" {
 | 
			
		||||
			ctype = "varchar(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
			// 回写到列信息
 | 
			
		||||
			if len(arr) > 1 {
 | 
			
		||||
				ctype = t1 + "(" + arr[1]
 | 
			
		||||
			} else {
 | 
			
		||||
				ctype = t1
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		column.ColumnType = ctype
 | 
			
		||||
		commonColumns = append(commonColumns, column)
 | 
			
		||||
func (md *MysqlDialect) ToCommonColumn(column *dbi.Column) {
 | 
			
		||||
	dataType := column.DataType
 | 
			
		||||
 | 
			
		||||
	t1 := commonColumnTypeMap[string(dataType)]
 | 
			
		||||
	commonColumnType := dbi.CommonTypeVarchar
 | 
			
		||||
 | 
			
		||||
	if t1 != "" {
 | 
			
		||||
		commonColumnType = t1
 | 
			
		||||
	}
 | 
			
		||||
	return commonColumns
 | 
			
		||||
 | 
			
		||||
	column.DataType = commonColumnType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MysqlDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Table, dropOldTable bool) (int, error) {
 | 
			
		||||
func (md *MysqlDialect) ToColumn(column *dbi.Column) {
 | 
			
		||||
	ctype := mysqlColumnTypeMap[column.DataType]
 | 
			
		||||
	if ctype == "" {
 | 
			
		||||
		column.DataType = "varchar"
 | 
			
		||||
		column.CharMaxLength = 1000
 | 
			
		||||
	} else {
 | 
			
		||||
		column.DataType = dbi.ColumnDataType(ctype)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MysqlDialect) CreateTable(columns []dbi.Column, tableInfo dbi.Table, dropOldTable bool) (int, error) {
 | 
			
		||||
	if dropOldTable {
 | 
			
		||||
		_, _ = md.dc.Exec(fmt.Sprintf("DROP TABLE IF EXISTS %s", tableInfo.TableName))
 | 
			
		||||
	}
 | 
			
		||||
@@ -109,22 +110,7 @@ func (md *MysqlDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Ta
 | 
			
		||||
	fields := make([]string, 0)
 | 
			
		||||
	pks := make([]string, 0)
 | 
			
		||||
	// 把通用类型转换为达梦类型
 | 
			
		||||
	for _, column := range commonColumns {
 | 
			
		||||
		// 取出当前数据库类型
 | 
			
		||||
		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
		ctype := arr[0]
 | 
			
		||||
		// 翻译为通用数据库类型
 | 
			
		||||
		t1 := mysqlColumnTypeMap[ctype]
 | 
			
		||||
		if t1 == "" {
 | 
			
		||||
			ctype = "varchar(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
			// 回写到列信息
 | 
			
		||||
			if len(arr) > 1 {
 | 
			
		||||
				ctype = t1 + "(" + arr[1]
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		column.ColumnType = ctype
 | 
			
		||||
 | 
			
		||||
	for _, column := range columns {
 | 
			
		||||
		if column.IsPrimaryKey {
 | 
			
		||||
			pks = append(pks, column.ColumnName)
 | 
			
		||||
		}
 | 
			
		||||
@@ -134,7 +120,7 @@ func (md *MysqlDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Ta
 | 
			
		||||
	if len(pks) > 0 {
 | 
			
		||||
		createSql += fmt.Sprintf(", PRIMARY KEY (%s)", strings.Join(pks, ","))
 | 
			
		||||
	}
 | 
			
		||||
	createSql += fmt.Sprintf(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ")
 | 
			
		||||
	createSql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 "
 | 
			
		||||
	if tableInfo.TableComment != "" {
 | 
			
		||||
		replacer := strings.NewReplacer(";", "", "'", "")
 | 
			
		||||
		createSql += fmt.Sprintf(" COMMENT '%s'", replacer.Replace(tableInfo.TableComment))
 | 
			
		||||
@@ -183,7 +169,7 @@ func (md *MysqlDialect) genColumnBasicSql(column dbi.Column) string {
 | 
			
		||||
		comment = fmt.Sprintf(" COMMENT '%s'", commentStr)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	columnSql := fmt.Sprintf(" %s %s %s %s %s %s", md.dc.GetMetaData().QuoteIdentifier(column.ColumnName), column.ColumnType, nullAble, incr, defVal, comment)
 | 
			
		||||
	columnSql := fmt.Sprintf(" %s %s %s %s %s %s", md.dc.GetMetaData().QuoteIdentifier(column.ColumnName), column.GetColumnType(), nullAble, incr, defVal, comment)
 | 
			
		||||
	return columnSql
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -211,7 +197,3 @@ func (md *MysqlDialect) CreateIndex(tableInfo dbi.Table, indexs []dbi.Index) err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MysqlDialect) UpdateSequence(tableName string, columns []dbi.Column) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import (
 | 
			
		||||
	"mayfly-go/pkg/errorx"
 | 
			
		||||
	"mayfly-go/pkg/utils/anyx"
 | 
			
		||||
	"mayfly-go/pkg/utils/collx"
 | 
			
		||||
	"mayfly-go/pkg/utils/stringx"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -15,12 +16,11 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	MYSQL_META_FILE               = "metasql/mysql_meta.sql"
 | 
			
		||||
	MYSQL_DBS                     = "MYSQL_DBS"
 | 
			
		||||
	MYSQL_TABLE_INFO_KEY          = "MYSQL_TABLE_INFO"
 | 
			
		||||
	MYSQL_TABLE_INFO_BY_NAMES_KEY = "MYSQL_TABLE_INFO_BY_NAMES"
 | 
			
		||||
	MYSQL_INDEX_INFO_KEY          = "MYSQL_INDEX_INFO"
 | 
			
		||||
	MYSQL_COLUMN_MA_KEY           = "MYSQL_COLUMN_MA"
 | 
			
		||||
	MYSQL_META_FILE      = "metasql/mysql_meta.sql"
 | 
			
		||||
	MYSQL_DBS            = "MYSQL_DBS"
 | 
			
		||||
	MYSQL_TABLE_INFO_KEY = "MYSQL_TABLE_INFO"
 | 
			
		||||
	MYSQL_INDEX_INFO_KEY = "MYSQL_INDEX_INFO"
 | 
			
		||||
	MYSQL_COLUMN_MA_KEY  = "MYSQL_COLUMN_MA"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type MysqlMetaData struct {
 | 
			
		||||
@@ -62,12 +62,12 @@ func (md *MysqlMetaData) GetTables(tableNames ...string) ([]dbi.Table, error) {
 | 
			
		||||
	var res []map[string]any
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	if tableNames != nil || len(tableNames) > 0 {
 | 
			
		||||
		_, res, err = md.dc.Query(fmt.Sprintf(dbi.GetLocalSql(MYSQL_META_FILE, MYSQL_TABLE_INFO_BY_NAMES_KEY), names))
 | 
			
		||||
	} else {
 | 
			
		||||
		_, res, err = md.dc.Query(dbi.GetLocalSql(MYSQL_META_FILE, MYSQL_TABLE_INFO_KEY))
 | 
			
		||||
	sql, err := stringx.TemplateParse(dbi.GetLocalSql(MYSQL_META_FILE, MYSQL_TABLE_INFO_KEY), collx.M{"tableNames": names})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, res, err = md.dc.Query(sql)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -104,12 +104,15 @@ func (md *MysqlMetaData) GetColumns(tableNames ...string) ([]dbi.Column, error)
 | 
			
		||||
			TableName:     anyx.ConvString(re["tableName"]),
 | 
			
		||||
			ColumnName:    anyx.ConvString(re["columnName"]),
 | 
			
		||||
			ColumnType:    strings.Replace(anyx.ConvString(re["columnType"]), " unsigned", "", 1),
 | 
			
		||||
			DataType:      dbi.ColumnDataType(anyx.ConvString(re["dataType"])),
 | 
			
		||||
			ColumnComment: anyx.ConvString(re["columnComment"]),
 | 
			
		||||
			Nullable:      anyx.ConvString(re["nullable"]),
 | 
			
		||||
			IsPrimaryKey:  anyx.ConvInt(re["isPrimaryKey"]) == 1,
 | 
			
		||||
			IsIdentity:    anyx.ConvInt(re["isIdentity"]) == 1,
 | 
			
		||||
			ColumnDefault: anyx.ConvString(re["columnDefault"]),
 | 
			
		||||
			NumScale:      anyx.ConvString(re["numScale"]),
 | 
			
		||||
			CharMaxLength: anyx.ConvInt(re["charMaxLength"]),
 | 
			
		||||
			NumPrecision:  anyx.ConvInt(re["numPrecision"]),
 | 
			
		||||
			NumScale:      anyx.ConvInt(re["numScale"]),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return columns, nil
 | 
			
		||||
@@ -215,7 +218,7 @@ var (
 | 
			
		||||
	converter = new(DataConverter)
 | 
			
		||||
 | 
			
		||||
	//  mysql数据类型 映射 公共数据类型
 | 
			
		||||
	commonColumnTypeMap = map[string]string{
 | 
			
		||||
	commonColumnTypeMap = map[string]dbi.ColumnDataType{
 | 
			
		||||
		"bigint":     dbi.CommonTypeBigint,
 | 
			
		||||
		"binary":     dbi.CommonTypeBinary,
 | 
			
		||||
		"blob":       dbi.CommonTypeBlob,
 | 
			
		||||
@@ -243,7 +246,7 @@ var (
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 公共数据类型 映射 mysql数据类型
 | 
			
		||||
	mysqlColumnTypeMap = map[string]string{
 | 
			
		||||
	mysqlColumnTypeMap = map[dbi.ColumnDataType]string{
 | 
			
		||||
		dbi.CommonTypeVarchar:    "varchar",
 | 
			
		||||
		dbi.CommonTypeChar:       "char",
 | 
			
		||||
		dbi.CommonTypeText:       "text",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user