feat: 完善后端脚手架基础能力
This commit is contained in:
+33
-4
@@ -5,6 +5,8 @@ import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
@@ -15,7 +17,7 @@ import (
|
||||
|
||||
func main() {
|
||||
var (
|
||||
env = flag.String("env", "local", "环境配置 (local/production)")
|
||||
env = flag.String("env", "", "Atlas 环境,默认根据应用环境和数据库驱动推断")
|
||||
action = flag.String("action", "", "操作类型: status, diff, apply, validate, reset, baseline")
|
||||
name = flag.String("name", "", "迁移名称 (仅用于 diff 操作)")
|
||||
dryRun = flag.Bool("dry-run", false, "模拟执行,不实际应用迁移 (仅用于 apply 操作)")
|
||||
@@ -41,8 +43,17 @@ func main() {
|
||||
}
|
||||
defer middlewares.Sync()
|
||||
|
||||
driver := normalizeDriver(cfg.Database.Driver)
|
||||
if driver != "postgres" && driver != "mysql" && driver != "sqlite" {
|
||||
middlewares.Logger.Fatal("不支持的数据库驱动", zap.String("driver", cfg.Database.Driver))
|
||||
}
|
||||
if *env == "" {
|
||||
*env = atlasEnvironment(cfg.App.Environment, driver)
|
||||
}
|
||||
|
||||
migrationConfig := &database.MigrationConfig{
|
||||
Environment: *env,
|
||||
Directory: filepath.Join("migrations", driver),
|
||||
Timeout: 240,
|
||||
}
|
||||
|
||||
@@ -72,6 +83,25 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
func normalizeDriver(driver string) string {
|
||||
switch strings.ToLower(strings.TrimSpace(driver)) {
|
||||
case "postgresql":
|
||||
return "postgres"
|
||||
case "sqlite3":
|
||||
return "sqlite"
|
||||
default:
|
||||
return strings.ToLower(strings.TrimSpace(driver))
|
||||
}
|
||||
}
|
||||
|
||||
func atlasEnvironment(environment, driver string) string {
|
||||
prefix := "local"
|
||||
if strings.EqualFold(environment, "production") {
|
||||
prefix = "production"
|
||||
}
|
||||
return prefix + "_" + driver
|
||||
}
|
||||
|
||||
func handleStatus(manager *database.MigrationManager) {
|
||||
fmt.Println("🔍 检查迁移状态...")
|
||||
if err := manager.CheckMigrations(); err != nil {
|
||||
@@ -96,12 +126,11 @@ func handleDiff(manager *database.MigrationManager, name string) {
|
||||
func handleApply(manager *database.MigrationManager, dryRun bool) {
|
||||
if dryRun {
|
||||
fmt.Println("🧪 模拟应用迁移 (dry-run)...")
|
||||
fmt.Println("注意: dry-run 功能需要在 Atlas 命令中添加 --dry-run 参数")
|
||||
} else {
|
||||
fmt.Println("🚀 应用迁移...")
|
||||
}
|
||||
|
||||
if err := manager.ApplyMigrations(); err != nil {
|
||||
if err := manager.ApplyMigrations(dryRun); err != nil {
|
||||
middlewares.Logger.Fatal("应用迁移失败", zap.Error(err))
|
||||
}
|
||||
fmt.Println("✅ 迁移应用完成")
|
||||
@@ -165,7 +194,7 @@ func printUsage() {
|
||||
fmt.Println(" baseline 基线迁移指导 (显示基线创建命令)")
|
||||
fmt.Println()
|
||||
fmt.Println("选项:")
|
||||
fmt.Println(" -env 环境配置 (默认: local)")
|
||||
fmt.Println(" -env Atlas 环境 (默认: local_<driver> 或 production_<driver>)")
|
||||
fmt.Println(" -name 迁移名称 (仅用于 diff)")
|
||||
fmt.Println(" -dry-run 模拟执行 (仅用于 apply)")
|
||||
fmt.Println()
|
||||
|
||||
Reference in New Issue
Block a user