96 lines
3.2 KiB
Go
96 lines
3.2 KiB
Go
// Command migrator 整库迁移命令行
|
|
//
|
|
// 用法(仓库根目录执行):
|
|
//
|
|
// go run ./cmd/migrator \
|
|
// -src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
|
|
// -src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
|
|
// -dst-type=pgsql -dst-host=127.0.0.1 -dst-hostport=5432 \
|
|
// -dst-database=easygoadmin.goframe.elevue -dst-username=postgres -dst-password=123456 \
|
|
// -drop-target-first
|
|
//
|
|
// 可选:-tables "goframe_user,goframe_level"(只迁指定表)、-batch-size=1000(数据批大小)
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/gogf/gf/v2/os/gctx"
|
|
|
|
_ "github.com/gogf/gf/contrib/drivers/mssql/v2"
|
|
_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
|
|
_ "github.com/gogf/gf/contrib/drivers/oracle/v2"
|
|
_ "github.com/gogf/gf/contrib/drivers/pgsql/v2"
|
|
_ "github.com/gogf/gf/contrib/drivers/sqlite/v2"
|
|
|
|
"easygoadmin/internal/migrate"
|
|
)
|
|
|
|
func main() {
|
|
// 源库连接要素
|
|
srcType := flag.String("src-type", "mysql", "源库类型:mysql/pgsql/sqlite/mssql/oracle")
|
|
srcHost := flag.String("src-host", "127.0.0.1", "源库地址")
|
|
srcPort := flag.String("src-hostport", "3306", "源库端口")
|
|
srcDB := flag.String("src-database", "", "源库库名(sqlite 填文件路径)")
|
|
srcUser := flag.String("src-username", "root", "源库用户名")
|
|
srcPass := flag.String("src-password", "", "源库密码")
|
|
// 目标库连接要素
|
|
dstType := flag.String("dst-type", "pgsql", "目标库类型:mysql/pgsql/sqlite/mssql/oracle")
|
|
dstHost := flag.String("dst-host", "127.0.0.1", "目标库地址")
|
|
dstPort := flag.String("dst-hostport", "5432", "目标库端口")
|
|
dstDB := flag.String("dst-database", "", "目标库库名(sqlite 填文件路径)")
|
|
dstUser := flag.String("dst-username", "postgres", "目标库用户名")
|
|
dstPass := flag.String("dst-password", "", "目标库密码")
|
|
// 迁移行为
|
|
dropFirst := flag.Bool("drop-target-first", false, "迁移前清空目标库全部表")
|
|
tables := flag.String("tables", "", "只迁指定表(逗号分隔,留空迁全部)")
|
|
batchSize := flag.Int("batch-size", 1000, "数据搬运批大小")
|
|
flag.Parse()
|
|
|
|
if *srcDB == "" || *dstDB == "" {
|
|
flag.Usage()
|
|
fmt.Fprintln(os.Stderr, "\n示例: go run ./cmd/migrator -src-database=easygoadmin -dst-database=easygoadmin -drop-target-first")
|
|
os.Exit(2)
|
|
}
|
|
|
|
ctx := gctx.New()
|
|
opt := migrate.Options{
|
|
Src: migrate.DSN{
|
|
Type: *srcType, Host: *srcHost, Port: *srcPort,
|
|
Database: *srcDB, Username: *srcUser, Password: *srcPass,
|
|
},
|
|
Dst: migrate.DSN{
|
|
Type: *dstType, Host: *dstHost, Port: *dstPort,
|
|
Database: *dstDB, Username: *dstUser, Password: *dstPass,
|
|
},
|
|
DropTargetFirst: *dropFirst,
|
|
Tables: splitList(*tables),
|
|
BatchSize: *batchSize,
|
|
}
|
|
|
|
_, err := migrate.Run(ctx, opt, func(format string, args ...any) {
|
|
fmt.Printf(format, args...)
|
|
})
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "\n迁移失败: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
// splitList 逗号分隔列表拆分(去空白)
|
|
func splitList(raw string) []string {
|
|
if strings.TrimSpace(raw) == "" {
|
|
return nil
|
|
}
|
|
out := make([]string, 0)
|
|
for _, item := range strings.Split(raw, ",") {
|
|
if s := strings.TrimSpace(item); s != "" {
|
|
out = append(out, s)
|
|
}
|
|
}
|
|
return out
|
|
}
|