mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 00:10:25 +08:00 
			
		
		
		
	refactor: dbms优化
This commit is contained in:
		@@ -162,12 +162,19 @@ func (app *dbTransferAppImpl) transferTables(task *entity.DbTransferTask, srcCon
 | 
			
		||||
	ctx := context.Background()
 | 
			
		||||
 | 
			
		||||
	for tbName, cols := range columnMap {
 | 
			
		||||
		// 在目标库建表
 | 
			
		||||
		// 把源列信息转化成公共列信息
 | 
			
		||||
		commonColumns := srcDialect.TransColumns(cols)
 | 
			
		||||
		targetCols := make([]dbi.Column, 0)
 | 
			
		||||
		for _, col := range cols {
 | 
			
		||||
			colPtr := &col
 | 
			
		||||
			// 源库列转为公共列
 | 
			
		||||
			srcDialect.ToCommonColumn(colPtr)
 | 
			
		||||
			// 公共列转为目标库列
 | 
			
		||||
			targetDialect.ToColumn(colPtr)
 | 
			
		||||
			targetCols = append(targetCols, *colPtr)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 通过公共列信息生成目标库的建表语句,并执行目标库建表
 | 
			
		||||
		logx.Infof("开始创建目标表: 表名:%s", tbName)
 | 
			
		||||
		_, err := targetDialect.CreateTable(commonColumns, tableMap[tbName], true)
 | 
			
		||||
		_, err := targetDialect.CreateTable(targetCols, tableMap[tbName], true)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			end(fmt.Sprintf("创建目标表失败: 表名:%s, error: %s", tbName, err.Error()), err)
 | 
			
		||||
			return
 | 
			
		||||
@@ -184,7 +191,7 @@ func (app *dbTransferAppImpl) transferTables(task *entity.DbTransferTask, srcCon
 | 
			
		||||
		logx.Infof("迁移数据成功: 表名:%s, 数据:%d 条", tbName, total)
 | 
			
		||||
 | 
			
		||||
		// 有些数据库迁移完数据之后,需要更新表自增序列为当前表最大值
 | 
			
		||||
		targetDialect.UpdateSequence(tbName, commonColumns)
 | 
			
		||||
		targetDialect.UpdateSequence(tbName, targetCols)
 | 
			
		||||
 | 
			
		||||
		// 迁移索引信息
 | 
			
		||||
		logx.Infof("开始迁移索引: 表名:%s", tbName)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,33 +2,7 @@ package dbi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"database/sql"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	CommonTypeVarchar    string = "varchar"
 | 
			
		||||
	CommonTypeChar       string = "char"
 | 
			
		||||
	CommonTypeText       string = "text"
 | 
			
		||||
	CommonTypeBlob       string = "blob"
 | 
			
		||||
	CommonTypeLongblob   string = "longblob"
 | 
			
		||||
	CommonTypeLongtext   string = "longtext"
 | 
			
		||||
	CommonTypeBinary     string = "binary"
 | 
			
		||||
	CommonTypeMediumblob string = "mediumblob"
 | 
			
		||||
	CommonTypeMediumtext string = "mediumtext"
 | 
			
		||||
	CommonTypeVarbinary  string = "varbinary"
 | 
			
		||||
 | 
			
		||||
	CommonTypeInt      string = "int"
 | 
			
		||||
	CommonTypeSmallint string = "smallint"
 | 
			
		||||
	CommonTypeTinyint  string = "tinyint"
 | 
			
		||||
	CommonTypeNumber   string = "number"
 | 
			
		||||
	CommonTypeBigint   string = "bigint"
 | 
			
		||||
 | 
			
		||||
	CommonTypeDatetime  string = "datetime"
 | 
			
		||||
	CommonTypeDate      string = "date"
 | 
			
		||||
	CommonTypeTime      string = "time"
 | 
			
		||||
	CommonTypeTimestamp string = "timestamp"
 | 
			
		||||
 | 
			
		||||
	CommonTypeEnum string = "enum"
 | 
			
		||||
	CommonTypeJSON string = "json"
 | 
			
		||||
	"errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@@ -60,13 +34,36 @@ type Dialect interface {
 | 
			
		||||
	// 拷贝表
 | 
			
		||||
	CopyTable(copy *DbCopyTable) error
 | 
			
		||||
 | 
			
		||||
	CreateTable(commonColumns []Column, tableInfo Table, dropOldTable bool) (int, error)
 | 
			
		||||
	CreateTable(columns []Column, tableInfo Table, dropOldTable bool) (int, error)
 | 
			
		||||
 | 
			
		||||
	CreateIndex(tableInfo Table, indexs []Index) error
 | 
			
		||||
 | 
			
		||||
	// 把方言类型转换为通用类型
 | 
			
		||||
	TransColumns(columns []Column) []Column
 | 
			
		||||
 | 
			
		||||
	// 有些数据库迁移完数据之后,需要更新表自增序列为当前表最大值
 | 
			
		||||
	UpdateSequence(tableName string, columns []Column)
 | 
			
		||||
 | 
			
		||||
	// 数据库方言自带的列转换为公共列
 | 
			
		||||
	ToCommonColumn(dialectColumn *Column)
 | 
			
		||||
 | 
			
		||||
	// 公共列转为各个数据库方言自带的列
 | 
			
		||||
	ToColumn(commonColumn *Column)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type DefaultDialect struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetDbProgram 获取数据库程序模块,用于数据库备份与恢复
 | 
			
		||||
func (dd *DefaultDialect) GetDbProgram() (DbProgram, error) {
 | 
			
		||||
	return nil, errors.New("not support db program")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (dd *DefaultDialect) ToCommonColumn(dialectColumn *Column) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (dd *DefaultDialect) ToColumn(commonColumn *Column) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (dd *DefaultDialect) UpdateSequence(tableName string, columns []Column) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ package dbi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"embed"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"mayfly-go/pkg/biz"
 | 
			
		||||
	"mayfly-go/pkg/utils/collx"
 | 
			
		||||
	"mayfly-go/pkg/utils/stringx"
 | 
			
		||||
@@ -59,16 +60,30 @@ type Table struct {
 | 
			
		||||
type Column struct {
 | 
			
		||||
	TableName     string         `json:"tableName"`     // 表名
 | 
			
		||||
	ColumnName    string         `json:"columnName"`    // 列名
 | 
			
		||||
	ColumnType    string  `json:"columnType"`    // 列类型
 | 
			
		||||
	ColumnType    string         `json:"columnType"`    // 列类型,包含类型等描述(后续移除)
 | 
			
		||||
	DataType      ColumnDataType `json:"dataType"`      // 数据类型
 | 
			
		||||
	ColumnComment string         `json:"columnComment"` // 列备注
 | 
			
		||||
	IsPrimaryKey  bool           `json:"isPrimaryKey"`  // 是否为主键
 | 
			
		||||
	IsIdentity    bool           `json:"isIdentity"`    // 是否自增
 | 
			
		||||
	ColumnDefault string         `json:"columnDefault"` // 默认值
 | 
			
		||||
	Nullable      string         `json:"nullable"`      // 是否可为null
 | 
			
		||||
	NumScale      string  `json:"numScale"`      // 小数点
 | 
			
		||||
	CharMaxLength int            `json:"charMaxLength"` // 字符最大长度
 | 
			
		||||
	NumPrecision  int            `json:"numPrecision"`  // 精度(总数字位数)
 | 
			
		||||
	NumScale      int            `json:"numScale"`      // 小数点位数
 | 
			
		||||
	Extra         collx.M        `json:"extra"`         // 其他额外信息
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 获取列类型,拼接数据类型与长度等。如varchar(2000),decimal(20,2)
 | 
			
		||||
func (c *Column) GetColumnType() string {
 | 
			
		||||
	if c.CharMaxLength > 0 {
 | 
			
		||||
		return fmt.Sprintf("%s(%d)", c.DataType, c.CharMaxLength)
 | 
			
		||||
	}
 | 
			
		||||
	if c.NumPrecision > 0 {
 | 
			
		||||
		return fmt.Sprintf("%s(%d,%d)", c.DataType, c.NumPrecision, c.NumScale)
 | 
			
		||||
	}
 | 
			
		||||
	return string(c.DataType)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 表索引信息
 | 
			
		||||
type Index struct {
 | 
			
		||||
	IndexName    string `json:"indexName"`    // 索引名
 | 
			
		||||
@@ -79,6 +94,35 @@ type Index struct {
 | 
			
		||||
	IsUnique     bool   `json:"isUnique"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ColumnDataType string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	CommonTypeVarchar    ColumnDataType = "varchar"
 | 
			
		||||
	CommonTypeChar       ColumnDataType = "char"
 | 
			
		||||
	CommonTypeText       ColumnDataType = "text"
 | 
			
		||||
	CommonTypeBlob       ColumnDataType = "blob"
 | 
			
		||||
	CommonTypeLongblob   ColumnDataType = "longblob"
 | 
			
		||||
	CommonTypeLongtext   ColumnDataType = "longtext"
 | 
			
		||||
	CommonTypeBinary     ColumnDataType = "binary"
 | 
			
		||||
	CommonTypeMediumblob ColumnDataType = "mediumblob"
 | 
			
		||||
	CommonTypeMediumtext ColumnDataType = "mediumtext"
 | 
			
		||||
	CommonTypeVarbinary  ColumnDataType = "varbinary"
 | 
			
		||||
 | 
			
		||||
	CommonTypeInt      ColumnDataType = "int"
 | 
			
		||||
	CommonTypeSmallint ColumnDataType = "smallint"
 | 
			
		||||
	CommonTypeTinyint  ColumnDataType = "tinyint"
 | 
			
		||||
	CommonTypeNumber   ColumnDataType = "number"
 | 
			
		||||
	CommonTypeBigint   ColumnDataType = "bigint"
 | 
			
		||||
 | 
			
		||||
	CommonTypeDatetime  ColumnDataType = "datetime"
 | 
			
		||||
	CommonTypeDate      ColumnDataType = "date"
 | 
			
		||||
	CommonTypeTime      ColumnDataType = "time"
 | 
			
		||||
	CommonTypeTimestamp ColumnDataType = "timestamp"
 | 
			
		||||
 | 
			
		||||
	CommonTypeEnum ColumnDataType = "enum"
 | 
			
		||||
	CommonTypeJSON ColumnDataType = "json"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type DataType string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
 
 | 
			
		||||
@@ -28,33 +28,9 @@ FROM all_objects a
 | 
			
		||||
WHERE a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID))
 | 
			
		||||
  AND a.object_type = 'TABLE'
 | 
			
		||||
  AND a.status = 'VALID'
 | 
			
		||||
ORDER BY a.object_name
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--DM_TABLE_INFO_BY_NAMES 表详细信息
 | 
			
		||||
SELECT a.object_name                                      as TABLE_NAME,
 | 
			
		||||
       b.comments                                         as TABLE_COMMENT,
 | 
			
		||||
       a.created                                          as CREATE_TIME,
 | 
			
		||||
       TABLE_USED_SPACE(
 | 
			
		||||
               (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID)),
 | 
			
		||||
               a.object_name
 | 
			
		||||
       ) * page()                                         as DATA_LENGTH,
 | 
			
		||||
       (SELECT sum(INDEX_USED_PAGES(id))* page()
 | 
			
		||||
        FROM SYSOBJECTS
 | 
			
		||||
        WHERE NAME IN (SELECT INDEX_NAME
 | 
			
		||||
                       FROM ALL_INDEXES
 | 
			
		||||
                       WHERE OWNER = 'wxb'
 | 
			
		||||
                         AND TABLE_NAME = a.object_name)) as INDEX_LENGTH,
 | 
			
		||||
       c.num_rows                                         as TABLE_ROWS
 | 
			
		||||
FROM all_objects a
 | 
			
		||||
         LEFT JOIN ALL_TAB_COMMENTS b ON b.TABLE_TYPE = 'TABLE'
 | 
			
		||||
    AND a.object_name = b.TABLE_NAME
 | 
			
		||||
    AND b.owner = a.owner
 | 
			
		||||
         LEFT JOIN (SELECT a.owner, a.table_name, a.num_rows FROM all_tables a) c
 | 
			
		||||
                   ON c.owner = a.owner AND c.table_name = a.object_name
 | 
			
		||||
WHERE a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID))
 | 
			
		||||
  AND a.object_type = 'TABLE'
 | 
			
		||||
  AND a.status = 'VALID'
 | 
			
		||||
  AND a.object_name in (%s)
 | 
			
		||||
    {{if .tableNames}}
 | 
			
		||||
        and a.object_name in ({{.tableNames}})
 | 
			
		||||
    {{end}}
 | 
			
		||||
ORDER BY a.object_name
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--DM_INDEX_INFO 表索引信息
 | 
			
		||||
 
 | 
			
		||||
@@ -32,21 +32,9 @@ FROM sys.tables t
 | 
			
		||||
         left OUTER JOIN sys.partitions p ON t.object_id = p.object_id AND p.index_id = 1
 | 
			
		||||
         left OUTER JOIN sys.extended_properties c ON t.object_id = c.major_id AND c.minor_id = 0 AND c.class = 1
 | 
			
		||||
where ss.name = ?
 | 
			
		||||
ORDER BY t.name DESC;
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--MSSQL_TABLE_INFO_BY_NAMES 表详细信息
 | 
			
		||||
SELECT t.name        AS tableName,
 | 
			
		||||
       ss.name AS tableSchema,
 | 
			
		||||
       c.value       AS tableComment,
 | 
			
		||||
       p.rows        AS tableRows,
 | 
			
		||||
       0             AS dataLength,
 | 
			
		||||
       0             AS indexLength,
 | 
			
		||||
       t.create_date AS createTime
 | 
			
		||||
FROM sys.tables t
 | 
			
		||||
         left OUTER JOIN sys.schemas ss on t.schema_id = ss.schema_id
 | 
			
		||||
         left OUTER JOIN sys.partitions p ON t.object_id = p.object_id AND p.index_id = 1
 | 
			
		||||
         left OUTER JOIN sys.extended_properties c ON t.object_id = c.major_id AND c.minor_id = 0 AND c.class = 1
 | 
			
		||||
where ss.name = ? and t.name in (%s)
 | 
			
		||||
{{if .tableNames}}
 | 
			
		||||
    and t.name in ({{.tableNames}})
 | 
			
		||||
{{end}}
 | 
			
		||||
ORDER BY t.name DESC;
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--MSSQL_INDEX_INFO 索引信息
 | 
			
		||||
 
 | 
			
		||||
@@ -19,25 +19,9 @@ FROM
 | 
			
		||||
  information_schema.tables
 | 
			
		||||
WHERE
 | 
			
		||||
  table_type = 'BASE TABLE'
 | 
			
		||||
  AND table_schema = (
 | 
			
		||||
    SELECT
 | 
			
		||||
      database ()
 | 
			
		||||
  )
 | 
			
		||||
ORDER BY table_name
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--MYSQL_TABLE_INFO_BY_NAMES 表详细信息
 | 
			
		||||
SELECT
 | 
			
		||||
  table_name tableName,
 | 
			
		||||
  table_comment tableComment,
 | 
			
		||||
  table_rows tableRows,
 | 
			
		||||
  data_length dataLength,
 | 
			
		||||
  index_length indexLength,
 | 
			
		||||
  create_time createTime
 | 
			
		||||
FROM
 | 
			
		||||
  information_schema.tables
 | 
			
		||||
WHERE
 | 
			
		||||
  table_type = 'BASE TABLE'
 | 
			
		||||
  AND table_name IN (%s)
 | 
			
		||||
    {{if .tableNames}}
 | 
			
		||||
        AND table_name IN ({{.tableNames}})
 | 
			
		||||
    {{end}}
 | 
			
		||||
  AND table_schema = (
 | 
			
		||||
    SELECT
 | 
			
		||||
      database ()
 | 
			
		||||
@@ -68,6 +52,7 @@ ORDER BY
 | 
			
		||||
SELECT table_name     tableName,
 | 
			
		||||
       column_name    columnName,
 | 
			
		||||
       column_type    columnType,
 | 
			
		||||
       data_type      dataType,
 | 
			
		||||
       column_default columnDefault,
 | 
			
		||||
       column_comment columnComment,
 | 
			
		||||
       CASE
 | 
			
		||||
@@ -81,7 +66,9 @@ SELECT table_name     tableName,
 | 
			
		||||
           ELSE 0
 | 
			
		||||
           END AS     isIdentity,
 | 
			
		||||
       is_nullable    nullable,
 | 
			
		||||
       NUMERIC_SCALE  numScale
 | 
			
		||||
       CHARACTER_MAXIMUM_LENGTH charMaxLength,
 | 
			
		||||
       NUMERIC_SCALE  numScale,
 | 
			
		||||
       NUMERIC_PRECISION numPrecision
 | 
			
		||||
FROM information_schema.COLUMNS
 | 
			
		||||
WHERE table_schema = (SELECT DATABASE())
 | 
			
		||||
  AND table_name IN (%s)
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,9 @@ from ALL_TABLES a
 | 
			
		||||
         left join ALL_OBJECTS c on c.OBJECT_TYPE = 'TABLE' AND c.OWNER = a.OWNER AND c.OBJECT_NAME = a.TABLE_NAME
 | 
			
		||||
         left join dba_segments d on d.SEGMENT_TYPE = 'TABLE' AND d.OWNER = a.OWNER AND d.SEGMENT_NAME = a.TABLE_NAME
 | 
			
		||||
where a.owner = (SELECT sys_context('USERENV', 'CURRENT_SCHEMA') FROM dual)
 | 
			
		||||
{{if .tableNames}}
 | 
			
		||||
    and a.TABLE_NAME in ({{.tableNames}})
 | 
			
		||||
{{end}}
 | 
			
		||||
ORDER BY a.TABLE_NAME
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--ORACLE_INDEX_INFO 表索引信息
 | 
			
		||||
 
 | 
			
		||||
@@ -29,26 +29,9 @@ where
 | 
			
		||||
    has_table_privilege(CAST(c.oid AS regclass), 'SELECT')
 | 
			
		||||
	and n.nspname = current_schema()
 | 
			
		||||
	and c.reltype > 0
 | 
			
		||||
order by c.relname
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--PGSQL_TABLE_INFO_BY_NAMES 表详细信息
 | 
			
		||||
select
 | 
			
		||||
	c.relname as "tableName",
 | 
			
		||||
	obj_description (c.oid) as "tableComment",
 | 
			
		||||
	pg_table_size ('"' || n.nspname || '"."' || c.relname || '"') as "dataLength",
 | 
			
		||||
	pg_indexes_size ('"' || n.nspname || '"."' || c.relname || '"') as "indexLength",
 | 
			
		||||
	psut.n_live_tup as "tableRows"
 | 
			
		||||
from
 | 
			
		||||
	pg_class c
 | 
			
		||||
join pg_namespace n on
 | 
			
		||||
	c.relnamespace = n.oid
 | 
			
		||||
join pg_stat_user_tables psut on
 | 
			
		||||
	psut.relid = c.oid
 | 
			
		||||
where
 | 
			
		||||
    has_table_privilege(CAST(c.oid AS regclass), 'SELECT')
 | 
			
		||||
	and n.nspname = current_schema()
 | 
			
		||||
	and c.reltype > 0
 | 
			
		||||
    and c.relname in (%s)
 | 
			
		||||
    {{if .tableNames}}
 | 
			
		||||
        and c.relname in ({{.tableNames}})
 | 
			
		||||
    {{end}}
 | 
			
		||||
order by c.relname
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--PGSQL_INDEX_INFO 表索引信息
 | 
			
		||||
 
 | 
			
		||||
@@ -8,19 +8,9 @@ select tbl_name as tableName,
 | 
			
		||||
FROM sqlite_master
 | 
			
		||||
WHERE type = 'table'
 | 
			
		||||
  and name not like 'sqlite_%'
 | 
			
		||||
ORDER BY tbl_name
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--SQLITE_TABLE_INFO_BY_NAMES 表详细信息
 | 
			
		||||
select tbl_name as tableName,
 | 
			
		||||
       ''       as tableComment,
 | 
			
		||||
       ''       as createTime,
 | 
			
		||||
       0        as dataLength,
 | 
			
		||||
       0        as indexLength,
 | 
			
		||||
       0        as tableRows
 | 
			
		||||
FROM sqlite_master
 | 
			
		||||
WHERE type = 'table'
 | 
			
		||||
  and name not like 'sqlite_%'
 | 
			
		||||
  and tbl_name in (%s)
 | 
			
		||||
    {{if .tableNames}}
 | 
			
		||||
        and tbl_name in ({{.tableNames}})
 | 
			
		||||
    {{end}}
 | 
			
		||||
ORDER BY tbl_name
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--SQLITE_INDEX_INFO 表索引信息
 | 
			
		||||
 
 | 
			
		||||
@@ -16,12 +16,9 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type DMDialect struct {
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
	dbi.DefaultDialect
 | 
			
		||||
 | 
			
		||||
// GetDbProgram 获取数据库程序模块,用于数据库备份与恢复
 | 
			
		||||
func (dd *DMDialect) GetDbProgram() (dbi.DbProgram, error) {
 | 
			
		||||
	return nil, fmt.Errorf("该数据库类型不支持数据库备份与恢复: %v", dd.dc.Info.Type)
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (dd *DMDialect) BatchInsert(tx *sql.Tx, tableName string, columns []string, values [][]any, duplicateStrategy int) (int64, error) {
 | 
			
		||||
@@ -168,28 +165,28 @@ func (dd *DMDialect) CopyTable(copy *dbi.DbCopyTable) error {
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (dd *DMDialect) TransColumns(columns []dbi.Column) []dbi.Column {
 | 
			
		||||
	var commonColumns []dbi.Column
 | 
			
		||||
	for _, column := range columns {
 | 
			
		||||
		// 取出当前数据库类型
 | 
			
		||||
		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
		ctype := arr[0]
 | 
			
		||||
// func (dd *DMDialect) TransColumns(columns []dbi.Column) []dbi.Column {
 | 
			
		||||
// 	var commonColumns []dbi.Column
 | 
			
		||||
// 	for _, column := range columns {
 | 
			
		||||
// 		// 取出当前数据库类型
 | 
			
		||||
// 		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
// 		ctype := arr[0]
 | 
			
		||||
 | 
			
		||||
		// 翻译为通用数据库类型
 | 
			
		||||
		t1 := commonColumnMap[ctype]
 | 
			
		||||
		if t1 == "" {
 | 
			
		||||
			ctype = "VARCHAR(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
			// 回写到列信息
 | 
			
		||||
			if len(arr) > 1 {
 | 
			
		||||
				ctype = t1 + "(" + arr[1]
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		column.ColumnType = ctype
 | 
			
		||||
		commonColumns = append(commonColumns, column)
 | 
			
		||||
	}
 | 
			
		||||
	return commonColumns
 | 
			
		||||
}
 | 
			
		||||
// 		// 翻译为通用数据库类型
 | 
			
		||||
// 		t1 := commonColumnMap[ctype]
 | 
			
		||||
// 		if t1 == "" {
 | 
			
		||||
// 			ctype = "VARCHAR(2000)"
 | 
			
		||||
// 		} else {
 | 
			
		||||
// 			// 回写到列信息
 | 
			
		||||
// 			if len(arr) > 1 {
 | 
			
		||||
// 				ctype = t1 + "(" + arr[1]
 | 
			
		||||
// 			}
 | 
			
		||||
// 		}
 | 
			
		||||
// 		column.ColumnType = ctype
 | 
			
		||||
// 		commonColumns = append(commonColumns, column)
 | 
			
		||||
// 	}
 | 
			
		||||
// 	return commonColumns
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (dd *DMDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Table, dropOldTable bool) (int, error) {
 | 
			
		||||
	meta := dd.dc.GetMetaData()
 | 
			
		||||
@@ -210,7 +207,7 @@ func (dd *DMDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Table
 | 
			
		||||
		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
		ctype := arr[0]
 | 
			
		||||
		// 翻译为通用数据库类型
 | 
			
		||||
		t1 := dmColumnMap[ctype]
 | 
			
		||||
		t1 := dmColumnMap[dbi.ColumnDataType(ctype)]
 | 
			
		||||
		if t1 == "" {
 | 
			
		||||
			ctype = "VARCHAR(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import (
 | 
			
		||||
	"mayfly-go/pkg/errorx"
 | 
			
		||||
	"mayfly-go/pkg/utils/anyx"
 | 
			
		||||
	"mayfly-go/pkg/utils/collx"
 | 
			
		||||
	"mayfly-go/pkg/utils/stringx"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -17,7 +18,6 @@ const (
 | 
			
		||||
	DM_TABLE_INFO_KEY = "DM_TABLE_INFO"
 | 
			
		||||
	DM_INDEX_INFO_KEY = "DM_INDEX_INFO"
 | 
			
		||||
	DM_COLUMN_MA_KEY  = "DM_COLUMN_MA"
 | 
			
		||||
	DM_TABLE_INFO_BY_NAMES_KEY = "DM_TABLE_INFO_BY_NAMES"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type DMMetaData struct {
 | 
			
		||||
@@ -59,11 +59,12 @@ func (dd *DMMetaData) GetTables(tableNames ...string) ([]dbi.Table, error) {
 | 
			
		||||
	var res []map[string]any
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	if tableNames != nil && len(tableNames) > 0 {
 | 
			
		||||
		_, res, err = dd.dc.Query(fmt.Sprintf(dbi.GetLocalSql(DM_META_FILE, DM_TABLE_INFO_BY_NAMES_KEY), names))
 | 
			
		||||
	} else {
 | 
			
		||||
		_, res, err = dd.dc.Query(dbi.GetLocalSql(DM_META_FILE, DM_TABLE_INFO_KEY))
 | 
			
		||||
	sql, err := stringx.TemplateParse(dbi.GetLocalSql(DM_META_FILE, DM_TABLE_INFO_KEY), collx.M{"tableNames": names})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, res, err = dd.dc.Query(sql)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -104,7 +105,7 @@ func (dd *DMMetaData) GetColumns(tableNames ...string) ([]dbi.Column, error) {
 | 
			
		||||
			IsPrimaryKey:  anyx.ConvInt(re["IS_PRIMARY_KEY"]) == 1,
 | 
			
		||||
			IsIdentity:    anyx.ConvInt(re["IS_IDENTITY"]) == 1,
 | 
			
		||||
			ColumnDefault: anyx.ConvString(re["COLUMN_DEFAULT"]),
 | 
			
		||||
			NumScale:      anyx.ConvString(re["NUM_SCALE"]),
 | 
			
		||||
			NumScale:      anyx.ConvInt(re["NUM_SCALE"]),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return columns, nil
 | 
			
		||||
@@ -266,7 +267,7 @@ var (
 | 
			
		||||
	converter = new(DataConverter)
 | 
			
		||||
 | 
			
		||||
	// 达梦数据类型 对应 公共数据类型
 | 
			
		||||
	commonColumnMap = map[string]string{
 | 
			
		||||
	commonColumnMap = map[string]dbi.ColumnDataType{
 | 
			
		||||
 | 
			
		||||
		"CHAR":          dbi.CommonTypeChar, // 字符数据类型
 | 
			
		||||
		"VARCHAR":       dbi.CommonTypeVarchar,
 | 
			
		||||
@@ -295,7 +296,7 @@ var (
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 公共数据类型 对应 达梦数据类型
 | 
			
		||||
	dmColumnMap = map[string]string{
 | 
			
		||||
	dmColumnMap = map[dbi.ColumnDataType]string{
 | 
			
		||||
		dbi.CommonTypeVarchar:    "VARCHAR",
 | 
			
		||||
		dbi.CommonTypeChar:       "CHAR",
 | 
			
		||||
		dbi.CommonTypeText:       "TEXT",
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,8 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type MssqlDialect struct {
 | 
			
		||||
	dbi.DefaultDialect
 | 
			
		||||
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -251,29 +253,29 @@ func (md *MssqlDialect) CopyTable(copy *dbi.DbCopyTable) error {
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MssqlDialect) 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 = "nvarchar(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
			// 回写到列信息
 | 
			
		||||
			if len(arr) > 1 {
 | 
			
		||||
				ctype = t1 + "(" + arr[1]
 | 
			
		||||
			} else {
 | 
			
		||||
				ctype = t1
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		column.ColumnType = ctype
 | 
			
		||||
		commonColumns = append(commonColumns, column)
 | 
			
		||||
	}
 | 
			
		||||
	return commonColumns
 | 
			
		||||
}
 | 
			
		||||
// func (md *MssqlDialect) 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 = "nvarchar(2000)"
 | 
			
		||||
// 		} else {
 | 
			
		||||
// 			// 回写到列信息
 | 
			
		||||
// 			if len(arr) > 1 {
 | 
			
		||||
// 				ctype = t1 + "(" + arr[1]
 | 
			
		||||
// 			} else {
 | 
			
		||||
// 				ctype = t1
 | 
			
		||||
// 			}
 | 
			
		||||
// 		}
 | 
			
		||||
// 		column.ColumnType = ctype
 | 
			
		||||
// 		commonColumns = append(commonColumns, column)
 | 
			
		||||
// 	}
 | 
			
		||||
// 	return commonColumns
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (md *MssqlDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Table, dropOldTable bool) (int, error) {
 | 
			
		||||
	meta := md.dc.GetMetaData()
 | 
			
		||||
@@ -292,7 +294,7 @@ func (md *MssqlDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Ta
 | 
			
		||||
		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
		ctype := arr[0]
 | 
			
		||||
		// 翻译为通用数据库类型
 | 
			
		||||
		t1 := mssqlColumnTypeMap[ctype]
 | 
			
		||||
		t1 := mssqlColumnTypeMap[dbi.ColumnDataType(ctype)]
 | 
			
		||||
		if t1 == "" {
 | 
			
		||||
			ctype = "nvarchar(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import (
 | 
			
		||||
	"mayfly-go/pkg/errorx"
 | 
			
		||||
	"mayfly-go/pkg/utils/anyx"
 | 
			
		||||
	"mayfly-go/pkg/utils/collx"
 | 
			
		||||
	"mayfly-go/pkg/utils/stringx"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -16,7 +17,6 @@ const (
 | 
			
		||||
	MSSQL_DBS_KEY             = "MSSQL_DBS"
 | 
			
		||||
	MSSQL_DB_SCHEMAS_KEY      = "MSSQL_DB_SCHEMAS"
 | 
			
		||||
	MSSQL_TABLE_INFO_KEY      = "MSSQL_TABLE_INFO"
 | 
			
		||||
	MSSQL_TABLE_INFO_BY_NAMES_KEY = "MSSQL_TABLE_INFO_BY_NAMES"
 | 
			
		||||
	MSSQL_INDEX_INFO_KEY      = "MSSQL_INDEX_INFO"
 | 
			
		||||
	MSSQL_COLUMN_MA_KEY       = "MSSQL_COLUMN_MA"
 | 
			
		||||
	MSSQL_TABLE_DETAIL_KEY    = "MSSQL_TABLE_DETAIL"
 | 
			
		||||
@@ -64,13 +64,16 @@ func (md *MssqlMetaData) 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(MSSQL_META_FILE, MSSQL_TABLE_INFO_BY_NAMES_KEY), names), schema)
 | 
			
		||||
	} else {
 | 
			
		||||
		_, res, err = md.dc.Query(dbi.GetLocalSql(MSSQL_META_FILE, MSSQL_TABLE_INFO_KEY), schema)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sql, err := stringx.TemplateParse(dbi.GetLocalSql(MSSQL_META_FILE, MSSQL_TABLE_INFO_KEY), collx.M{"tableNames": names})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, res, err = md.dc.Query(sql, schema)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -112,7 +115,7 @@ func (md *MssqlMetaData) GetColumns(tableNames ...string) ([]dbi.Column, error)
 | 
			
		||||
			IsPrimaryKey:  anyx.ConvInt(re["IS_PRIMARY_KEY"]) == 1,
 | 
			
		||||
			IsIdentity:    anyx.ConvInt(re["IS_IDENTITY"]) == 1,
 | 
			
		||||
			ColumnDefault: anyx.ToString(re["COLUMN_DEFAULT"]),
 | 
			
		||||
			NumScale:      anyx.ToString(re["NUM_SCALE"]),
 | 
			
		||||
			NumScale:      anyx.ConvInt(re["NUM_SCALE"]),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return columns, nil
 | 
			
		||||
@@ -314,7 +317,7 @@ var (
 | 
			
		||||
	// 定义正则表达式,匹配括号内的数字
 | 
			
		||||
	bracketsRegexp = regexp.MustCompile(`\((\d+)\)`)
 | 
			
		||||
	// mssql数据类型 对应 公共数据类型
 | 
			
		||||
	commonColumnTypeMap = map[string]string{
 | 
			
		||||
	commonColumnTypeMap = map[string]dbi.ColumnDataType{
 | 
			
		||||
		"bigint":           dbi.CommonTypeBigint,
 | 
			
		||||
		"numeric":          dbi.CommonTypeNumber,
 | 
			
		||||
		"bit":              dbi.CommonTypeInt,
 | 
			
		||||
@@ -353,7 +356,7 @@ var (
 | 
			
		||||
 | 
			
		||||
	// 公共数据类型 对应 mssql数据类型
 | 
			
		||||
 | 
			
		||||
	mssqlColumnTypeMap = map[string]string{
 | 
			
		||||
	mssqlColumnTypeMap = map[dbi.ColumnDataType]string{
 | 
			
		||||
		dbi.CommonTypeVarchar:    "nvarchar",
 | 
			
		||||
		dbi.CommonTypeChar:       "nchar",
 | 
			
		||||
		dbi.CommonTypeText:       "ntext",
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
	}
 | 
			
		||||
	return commonColumns
 | 
			
		||||
func (md *MysqlDialect) ToCommonColumn(column *dbi.Column) {
 | 
			
		||||
	dataType := column.DataType
 | 
			
		||||
 | 
			
		||||
	t1 := commonColumnTypeMap[string(dataType)]
 | 
			
		||||
	commonColumnType := dbi.CommonTypeVarchar
 | 
			
		||||
 | 
			
		||||
	if t1 != "" {
 | 
			
		||||
		commonColumnType = t1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
func (md *MysqlDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Table, dropOldTable bool) (int, error) {
 | 
			
		||||
	column.DataType = commonColumnType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
@@ -18,7 +19,6 @@ 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"
 | 
			
		||||
)
 | 
			
		||||
@@ -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",
 | 
			
		||||
 
 | 
			
		||||
@@ -14,12 +14,9 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type OracleDialect struct {
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
	dbi.DefaultDialect
 | 
			
		||||
 | 
			
		||||
// GetDbProgram 获取数据库程序模块,用于数据库备份与恢复
 | 
			
		||||
func (od *OracleDialect) GetDbProgram() (dbi.DbProgram, error) {
 | 
			
		||||
	return nil, fmt.Errorf("该数据库类型不支持数据库备份与恢复: %v", od.dc.Info.Type)
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (od *OracleDialect) BatchInsert(tx *sql.Tx, tableName string, columns []string, values [][]any, duplicateStrategy int) (int64, error) {
 | 
			
		||||
@@ -159,37 +156,37 @@ func (od *OracleDialect) CopyTable(copy *dbi.DbCopyTable) error {
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (od *OracleDialect) TransColumns(columns []dbi.Column) []dbi.Column {
 | 
			
		||||
	var commonColumns []dbi.Column
 | 
			
		||||
	for _, column := range columns {
 | 
			
		||||
		// 取出当前数据库类型
 | 
			
		||||
		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
		ctype := arr[0]
 | 
			
		||||
// func (od *OracleDialect) 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 = "NVARCHAR2(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
			// 回写到列信息
 | 
			
		||||
			if t1 == "NUMBER" {
 | 
			
		||||
				// 如果是转number类型,需要根据公共类型加上长度, 如 bigint 需要转换为number(19,0)
 | 
			
		||||
				if column.ColumnType == dbi.CommonTypeBigint {
 | 
			
		||||
					ctype = t1 + "(19, 0)"
 | 
			
		||||
				} else {
 | 
			
		||||
					ctype = t1
 | 
			
		||||
				}
 | 
			
		||||
			} else if t1 != "NUMBER" && len(arr) > 1 {
 | 
			
		||||
				ctype = t1 + "(" + arr[1]
 | 
			
		||||
			} else {
 | 
			
		||||
				ctype = t1
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		column.ColumnType = ctype
 | 
			
		||||
		commonColumns = append(commonColumns, column)
 | 
			
		||||
	}
 | 
			
		||||
	return commonColumns
 | 
			
		||||
}
 | 
			
		||||
// 		// 翻译为通用数据库类型
 | 
			
		||||
// 		t1 := commonColumnTypeMap[ctype]
 | 
			
		||||
// 		if t1 == "" {
 | 
			
		||||
// 			ctype = "NVARCHAR2(2000)"
 | 
			
		||||
// 		} else {
 | 
			
		||||
// 			// 回写到列信息
 | 
			
		||||
// 			if t1 == "NUMBER" {
 | 
			
		||||
// 				// 如果是转number类型,需要根据公共类型加上长度, 如 bigint 需要转换为number(19,0)
 | 
			
		||||
// 				if column.ColumnType == dbi.CommonTypeBigint {
 | 
			
		||||
// 					ctype = t1 + "(19, 0)"
 | 
			
		||||
// 				} else {
 | 
			
		||||
// 					ctype = t1
 | 
			
		||||
// 				}
 | 
			
		||||
// 			} else if t1 != "NUMBER" && len(arr) > 1 {
 | 
			
		||||
// 				ctype = t1 + "(" + arr[1]
 | 
			
		||||
// 			} else {
 | 
			
		||||
// 				ctype = t1
 | 
			
		||||
// 			}
 | 
			
		||||
// 		}
 | 
			
		||||
// 		column.ColumnType = ctype
 | 
			
		||||
// 		commonColumns = append(commonColumns, column)
 | 
			
		||||
// 	}
 | 
			
		||||
// 	return commonColumns
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (od *OracleDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Table, dropOldTable bool) (int, error) {
 | 
			
		||||
	meta := od.dc.GetMetaData()
 | 
			
		||||
@@ -220,7 +217,7 @@ end;
 | 
			
		||||
		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
		ctype := arr[0]
 | 
			
		||||
		// 翻译为通用数据库类型
 | 
			
		||||
		t1 := oracleColumnTypeMap[ctype]
 | 
			
		||||
		t1 := oracleColumnTypeMap[dbi.ColumnDataType(ctype)]
 | 
			
		||||
		if t1 == "" {
 | 
			
		||||
			ctype = "NVARCHAR2(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import (
 | 
			
		||||
	"mayfly-go/pkg/errorx"
 | 
			
		||||
	"mayfly-go/pkg/utils/anyx"
 | 
			
		||||
	"mayfly-go/pkg/utils/collx"
 | 
			
		||||
	"mayfly-go/pkg/utils/stringx"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -16,7 +17,6 @@ const (
 | 
			
		||||
	ORACLE_META_FILE      = "metasql/oracle_meta.sql"
 | 
			
		||||
	ORACLE_DB_SCHEMAS     = "ORACLE_DB_SCHEMAS"
 | 
			
		||||
	ORACLE_TABLE_INFO_KEY = "ORACLE_TABLE_INFO"
 | 
			
		||||
	ORACLE_TABLE_INFO_BY_NAMES_KEY = "ORACLE_TABLE_INFO_BY_NAMES"
 | 
			
		||||
	ORACLE_INDEX_INFO_KEY = "ORACLE_INDEX_INFO"
 | 
			
		||||
	ORACLE_COLUMN_MA_KEY  = "ORACLE_COLUMN_MA"
 | 
			
		||||
)
 | 
			
		||||
@@ -61,11 +61,12 @@ func (od *OracleMetaData) GetTables(tableNames ...string) ([]dbi.Table, error) {
 | 
			
		||||
	var res []map[string]any
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	if tableNames != nil || len(tableNames) > 0 {
 | 
			
		||||
		_, res, err = od.dc.Query(fmt.Sprintf(dbi.GetLocalSql(ORACLE_META_FILE, ORACLE_TABLE_INFO_BY_NAMES_KEY), names))
 | 
			
		||||
	} else {
 | 
			
		||||
		_, res, err = od.dc.Query(dbi.GetLocalSql(ORACLE_META_FILE, ORACLE_TABLE_INFO_KEY))
 | 
			
		||||
	sql, err := stringx.TemplateParse(dbi.GetLocalSql(ORACLE_META_FILE, ORACLE_TABLE_INFO_KEY), collx.M{"tableNames": names})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, res, err = od.dc.Query(sql)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -130,7 +131,7 @@ func (od *OracleMetaData) GetColumns(tableNames ...string) ([]dbi.Column, error)
 | 
			
		||||
			IsPrimaryKey:  anyx.ConvInt(re["IS_PRIMARY_KEY"]) == 1,
 | 
			
		||||
			IsIdentity:    anyx.ConvInt(re["IS_IDENTITY"]) == 1,
 | 
			
		||||
			ColumnDefault: defaultVal,
 | 
			
		||||
			NumScale:      anyx.ConvString(re["NUM_SCALE"]),
 | 
			
		||||
			NumScale:      anyx.ConvInt(re["NUM_SCALE"]),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return columns, nil
 | 
			
		||||
@@ -286,7 +287,7 @@ var (
 | 
			
		||||
	converter = new(DataConverter)
 | 
			
		||||
 | 
			
		||||
	// oracle数据类型 映射 公共数据类型
 | 
			
		||||
	commonColumnTypeMap = map[string]string{
 | 
			
		||||
	commonColumnTypeMap = map[string]dbi.ColumnDataType{
 | 
			
		||||
		"CHAR":          dbi.CommonTypeChar,
 | 
			
		||||
		"NCHAR":         dbi.CommonTypeChar,
 | 
			
		||||
		"VARCHAR2":      dbi.CommonTypeVarchar,
 | 
			
		||||
@@ -309,7 +310,7 @@ var (
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 公共数据类型 映射 oracle数据类型
 | 
			
		||||
	oracleColumnTypeMap = map[string]string{
 | 
			
		||||
	oracleColumnTypeMap = map[dbi.ColumnDataType]string{
 | 
			
		||||
		dbi.CommonTypeVarchar:    "NVARCHAR2",
 | 
			
		||||
		dbi.CommonTypeChar:       "NCHAR",
 | 
			
		||||
		dbi.CommonTypeText:       "CLOB",
 | 
			
		||||
 
 | 
			
		||||
@@ -11,12 +11,9 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type PgsqlDialect struct {
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
	dbi.DefaultDialect
 | 
			
		||||
 | 
			
		||||
// GetDbProgram 获取数据库程序模块,用于数据库备份与恢复
 | 
			
		||||
func (pd *PgsqlDialect) GetDbProgram() (dbi.DbProgram, error) {
 | 
			
		||||
	return nil, fmt.Errorf("该数据库类型不支持数据库备份与恢复: %v", pd.dc.Info.Type)
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (pd *PgsqlDialect) BatchInsert(tx *sql.Tx, tableName string, columns []string, values [][]any, duplicateStrategy int) (int64, error) {
 | 
			
		||||
@@ -183,30 +180,6 @@ func (pd *PgsqlDialect) CopyTable(copy *dbi.DbCopyTable) error {
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (pd *PgsqlDialect) 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)
 | 
			
		||||
	}
 | 
			
		||||
	return commonColumns
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (pd *PgsqlDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Table, dropOldTable bool) (int, error) {
 | 
			
		||||
	meta := pd.dc.GetMetaData()
 | 
			
		||||
	replacer := strings.NewReplacer(";", "", "'", "")
 | 
			
		||||
@@ -224,7 +197,7 @@ func (pd *PgsqlDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Ta
 | 
			
		||||
		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
		ctype := arr[0]
 | 
			
		||||
		// 翻译为通用数据库类型
 | 
			
		||||
		t1 := pgsqlColumnTypeMap[ctype]
 | 
			
		||||
		t1 := pgsqlColumnTypeMap[dbi.ColumnDataType(ctype)]
 | 
			
		||||
		if t1 == "" {
 | 
			
		||||
			ctype = "varchar(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import (
 | 
			
		||||
	"mayfly-go/pkg/errorx"
 | 
			
		||||
	"mayfly-go/pkg/utils/anyx"
 | 
			
		||||
	"mayfly-go/pkg/utils/collx"
 | 
			
		||||
	"mayfly-go/pkg/utils/stringx"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -18,7 +19,6 @@ const (
 | 
			
		||||
	PGSQL_INDEX_INFO_KEY = "PGSQL_INDEX_INFO"
 | 
			
		||||
	PGSQL_COLUMN_MA_KEY  = "PGSQL_COLUMN_MA"
 | 
			
		||||
	PGSQL_TABLE_DDL_KEY  = "PGSQL_TABLE_DDL_FUNC"
 | 
			
		||||
	PGSQL_TABLE_INFO_BY_NAMES_KEY = "PGSQL_TABLE_INFO_BY_NAMES"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type PgsqlMetaData struct {
 | 
			
		||||
@@ -61,14 +61,16 @@ func (pd *PgsqlMetaData) GetTables(tableNames ...string) ([]dbi.Table, error) {
 | 
			
		||||
	var res []map[string]any
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	if tableNames != nil || len(tableNames) > 0 {
 | 
			
		||||
		_, res, err = pd.dc.Query(fmt.Sprintf(dbi.GetLocalSql(PGSQL_META_FILE, PGSQL_TABLE_INFO_BY_NAMES_KEY), names))
 | 
			
		||||
	} else {
 | 
			
		||||
		_, res, err = pd.dc.Query(dbi.GetLocalSql(PGSQL_META_FILE, PGSQL_TABLE_INFO_KEY))
 | 
			
		||||
	}
 | 
			
		||||
	sql, err := stringx.TemplateParse(dbi.GetLocalSql(PGSQL_META_FILE, PGSQL_TABLE_INFO_KEY), collx.M{"tableNames": names})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, res, err = pd.dc.Query(sql)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tables := make([]dbi.Table, 0)
 | 
			
		||||
	for _, re := range res {
 | 
			
		||||
		tables = append(tables, dbi.Table{
 | 
			
		||||
@@ -106,7 +108,7 @@ func (pd *PgsqlMetaData) GetColumns(tableNames ...string) ([]dbi.Column, error)
 | 
			
		||||
			IsPrimaryKey:  anyx.ConvInt(re["isPrimaryKey"]) == 1,
 | 
			
		||||
			IsIdentity:    anyx.ConvInt(re["isIdentity"]) == 1,
 | 
			
		||||
			ColumnDefault: anyx.ConvString(re["columnDefault"]),
 | 
			
		||||
			NumScale:      anyx.ConvString(re["numScale"]),
 | 
			
		||||
			NumScale:      anyx.ConvInt(re["numScale"]),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return columns, nil
 | 
			
		||||
@@ -228,7 +230,7 @@ var (
 | 
			
		||||
	converter = new(DataConverter)
 | 
			
		||||
 | 
			
		||||
	// pgsql数据类型 映射 公共数据类型
 | 
			
		||||
	commonColumnTypeMap = map[string]string{
 | 
			
		||||
	commonColumnTypeMap = map[string]dbi.ColumnDataType{
 | 
			
		||||
		"int2":        dbi.CommonTypeSmallint,
 | 
			
		||||
		"int4":        dbi.CommonTypeInt,
 | 
			
		||||
		"int8":        dbi.CommonTypeBigint,
 | 
			
		||||
@@ -251,7 +253,7 @@ var (
 | 
			
		||||
		"timestamp":   dbi.CommonTypeTimestamp,
 | 
			
		||||
	}
 | 
			
		||||
	// 公共数据类型 映射 pgsql数据类型
 | 
			
		||||
	pgsqlColumnTypeMap = map[string]string{
 | 
			
		||||
	pgsqlColumnTypeMap = map[dbi.ColumnDataType]string{
 | 
			
		||||
		dbi.CommonTypeVarchar:    "varchar",
 | 
			
		||||
		dbi.CommonTypeChar:       "char",
 | 
			
		||||
		dbi.CommonTypeText:       "text",
 | 
			
		||||
 
 | 
			
		||||
@@ -11,12 +11,9 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SqliteDialect struct {
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
	dbi.DefaultDialect
 | 
			
		||||
 | 
			
		||||
// GetDbProgram 获取数据库程序模块,用于数据库备份与恢复
 | 
			
		||||
func (sd *SqliteDialect) GetDbProgram() (dbi.DbProgram, error) {
 | 
			
		||||
	return nil, fmt.Errorf("该数据库类型不支持数据库备份与恢复: %v", sd.dc.Info.Type)
 | 
			
		||||
	dc *dbi.DbConn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sd *SqliteDialect) BatchInsert(tx *sql.Tx, tableName string, columns []string, values [][]any, duplicateStrategy int) (int64, error) {
 | 
			
		||||
@@ -91,29 +88,29 @@ func (sd *SqliteDialect) CopyTable(copy *dbi.DbCopyTable) error {
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (sd *SqliteDialect) 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)
 | 
			
		||||
	}
 | 
			
		||||
	return commonColumns
 | 
			
		||||
}
 | 
			
		||||
// func (sd *SqliteDialect) 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)
 | 
			
		||||
// 	}
 | 
			
		||||
// 	return commonColumns
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (sd *SqliteDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.Table, dropOldTable bool) (int, error) {
 | 
			
		||||
	tbName := sd.dc.GetMetaData().QuoteIdentifier(tableInfo.TableName)
 | 
			
		||||
@@ -133,7 +130,7 @@ func (sd *SqliteDialect) CreateTable(commonColumns []dbi.Column, tableInfo dbi.T
 | 
			
		||||
		arr := strings.Split(column.ColumnType, "(")
 | 
			
		||||
		ctype := arr[0]
 | 
			
		||||
		// 翻译为通用数据库类型
 | 
			
		||||
		t1 := sqliteColumnTypeMap[ctype]
 | 
			
		||||
		t1 := sqliteColumnTypeMap[dbi.ColumnDataType(ctype)]
 | 
			
		||||
		if t1 == "" {
 | 
			
		||||
			ctype = "nvarchar(2000)"
 | 
			
		||||
		} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import (
 | 
			
		||||
	"mayfly-go/pkg/logx"
 | 
			
		||||
	"mayfly-go/pkg/utils/anyx"
 | 
			
		||||
	"mayfly-go/pkg/utils/collx"
 | 
			
		||||
	"mayfly-go/pkg/utils/stringx"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -16,7 +17,6 @@ const (
 | 
			
		||||
	SQLITE_META_FILE      = "metasql/sqlite_meta.sql"
 | 
			
		||||
	SQLITE_TABLE_INFO_KEY = "SQLITE_TABLE_INFO"
 | 
			
		||||
	SQLITE_INDEX_INFO_KEY = "SQLITE_INDEX_INFO"
 | 
			
		||||
	SQLITE_TABLE_INFO_BY_NAMES_KEY = "SQLITE_TABLE_INFO_BY_NAMES"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SqliteMetaData struct {
 | 
			
		||||
@@ -58,14 +58,16 @@ func (sd *SqliteMetaData) GetTables(tableNames ...string) ([]dbi.Table, error) {
 | 
			
		||||
	var res []map[string]any
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	if tableNames != nil || len(tableNames) > 0 {
 | 
			
		||||
		_, res, err = sd.dc.Query(fmt.Sprintf(dbi.GetLocalSql(SQLITE_META_FILE, SQLITE_TABLE_INFO_BY_NAMES_KEY), names))
 | 
			
		||||
	} else {
 | 
			
		||||
		_, res, err = sd.dc.Query(dbi.GetLocalSql(SQLITE_META_FILE, SQLITE_TABLE_INFO_KEY))
 | 
			
		||||
	}
 | 
			
		||||
	sql, err := stringx.TemplateParse(dbi.GetLocalSql(SQLITE_META_FILE, SQLITE_TABLE_INFO_KEY), collx.M{"tableNames": names})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, res, err = sd.dc.Query(sql)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tables := make([]dbi.Table, 0)
 | 
			
		||||
	for _, re := range res {
 | 
			
		||||
		tables = append(tables, dbi.Table{
 | 
			
		||||
@@ -111,7 +113,7 @@ func (sd *SqliteMetaData) GetColumns(tableNames ...string) ([]dbi.Column, error)
 | 
			
		||||
				IsPrimaryKey:  anyx.ConvInt(re["pk"]) == 1,
 | 
			
		||||
				IsIdentity:    anyx.ConvInt(re["pk"]) == 1,
 | 
			
		||||
				ColumnDefault: defaultValue,
 | 
			
		||||
				NumScale:      "0",
 | 
			
		||||
				NumScale:      0,
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -204,7 +206,7 @@ var (
 | 
			
		||||
	converter = new(DataConverter)
 | 
			
		||||
 | 
			
		||||
	//  sqlite数据类型 映射 公共数据类型
 | 
			
		||||
	commonColumnTypeMap = map[string]string{
 | 
			
		||||
	commonColumnTypeMap = map[string]dbi.ColumnDataType{
 | 
			
		||||
		"int":               dbi.CommonTypeInt,
 | 
			
		||||
		"integer":           dbi.CommonTypeInt,
 | 
			
		||||
		"tinyint":           dbi.CommonTypeTinyint,
 | 
			
		||||
@@ -234,7 +236,7 @@ var (
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//  公共数据类型 映射 sqlite数据类型
 | 
			
		||||
	sqliteColumnTypeMap = map[string]string{
 | 
			
		||||
	sqliteColumnTypeMap = map[dbi.ColumnDataType]string{
 | 
			
		||||
		dbi.CommonTypeVarchar:    "nvarchar",
 | 
			
		||||
		dbi.CommonTypeChar:       "nchar",
 | 
			
		||||
		dbi.CommonTypeText:       "text",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user