mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-11 17:09:45 +08:00
- 统一同库同步与跨库迁移入口,补充模式区分与风险提示 - 扩展 ClickHouse 与 PG-like 双向迁移,并新增 PG-like、ClickHouse、TDengine 到 MongoDB 的迁移路由 - 完善 TDengine 目标端建表规划、回归测试与需求追踪文档 - refs #51
59 lines
1.8 KiB
Go
59 lines
1.8 KiB
Go
package sync
|
|
|
|
import (
|
|
"GoNavi-Wails/internal/connection"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
func supportsAutoAddColumnsForPair(sourceType string, targetType string) bool {
|
|
source := normalizeMigrationDBType(sourceType)
|
|
target := normalizeMigrationDBType(targetType)
|
|
if isMySQLLikeWritableTargetType(target) {
|
|
return isMySQLCoreType(source)
|
|
}
|
|
if isPGLikeTarget(target) {
|
|
return isMySQLLikeSourceType(source)
|
|
}
|
|
return false
|
|
}
|
|
|
|
func buildAddColumnSQLForPair(sourceType string, targetType string, targetQueryTable string, sourceCol connection.ColumnDefinition) (string, error) {
|
|
source := normalizeMigrationDBType(sourceType)
|
|
target := normalizeMigrationDBType(targetType)
|
|
switch {
|
|
case isMySQLCoreType(source) && isMySQLLikeWritableTargetType(target):
|
|
colType := sanitizeMySQLColumnType(sourceCol.Type)
|
|
return fmt.Sprintf("ALTER TABLE %s ADD COLUMN %s %s NULL",
|
|
quoteQualifiedIdentByType("mysql", targetQueryTable),
|
|
quoteIdentByType("mysql", sourceCol.Name),
|
|
colType,
|
|
), nil
|
|
case isMySQLLikeSourceType(source) && isPGLikeTarget(target):
|
|
colType, _, warnings := mapMySQLColumnToKingbase(sourceCol)
|
|
if len(warnings) > 0 && strings.Contains(strings.Join(warnings, " "), "identity") {
|
|
// 对已有目标表补字段时保守处理,不补建自增语义。
|
|
}
|
|
return fmt.Sprintf("ALTER TABLE %s ADD COLUMN %s %s NULL",
|
|
quoteQualifiedIdentByType(target, targetQueryTable),
|
|
quoteIdentByType(target, sourceCol.Name),
|
|
colType,
|
|
), nil
|
|
default:
|
|
return "", fmt.Errorf("当前不支持 source=%s target=%s 的自动补字段", sourceType, targetType)
|
|
}
|
|
}
|
|
|
|
func executeSQLStatements(execFn func(string) (int64, error), statements []string) error {
|
|
for _, stmt := range statements {
|
|
trimmed := strings.TrimSpace(stmt)
|
|
if trimmed == "" {
|
|
continue
|
|
}
|
|
if _, err := execFn(trimmed); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|