调整迁移的逻辑
This commit is contained in:
@@ -25,46 +25,41 @@ import (
|
||||
//
|
||||
// import "git.toowon.com/jimmy/go-common/migration"
|
||||
// migration.RunMigrationsFromConfig("config.json", "migrations")
|
||||
// // 或使用默认迁移目录
|
||||
// migration.RunMigrationsFromConfig("config.json", "")
|
||||
func RunMigrationsFromConfig(configFile, migrationsDir string) error {
|
||||
// 加载配置
|
||||
cfg, err := loadConfigFromFileOrEnv(configFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("加载配置失败: %w", err)
|
||||
}
|
||||
|
||||
// 连接数据库
|
||||
db, err := connectDB(cfg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("连接数据库失败: %w", err)
|
||||
}
|
||||
|
||||
// 创建迁移器
|
||||
migrator := NewMigrator(db)
|
||||
|
||||
// 加载迁移文件
|
||||
migrations, err := LoadMigrationsFromFiles(migrationsDir, "*.sql")
|
||||
if err != nil {
|
||||
return fmt.Errorf("加载迁移文件失败: %w", err)
|
||||
}
|
||||
|
||||
if len(migrations) == 0 {
|
||||
fmt.Printf("在目录 '%s' 中没有找到迁移文件\n", migrationsDir)
|
||||
return nil
|
||||
}
|
||||
|
||||
migrator.AddMigrations(migrations...)
|
||||
|
||||
// 执行迁移
|
||||
if err := migrator.Up(); err != nil {
|
||||
return fmt.Errorf("执行迁移失败: %w", err)
|
||||
}
|
||||
|
||||
fmt.Println("✓ 迁移执行成功")
|
||||
return nil
|
||||
return RunMigrationsFromConfigWithCommand(configFile, migrationsDir, "up")
|
||||
}
|
||||
|
||||
// RunMigrationsFromConfigWithCommand 从配置文件运行迁移(支持命令)
|
||||
// command: "up", "down", "status"
|
||||
// RunMigrationsFromConfigWithCommand 从配置文件运行迁移(支持命令,黑盒模式)
|
||||
//
|
||||
// 这是最简单的迁移方式,内部自动处理:
|
||||
// - 配置加载(支持文件、环境变量、默认路径)
|
||||
// - 数据库连接(自动识别数据库类型)
|
||||
// - 迁移文件加载和执行
|
||||
//
|
||||
// 参数:
|
||||
// - configFile: 配置文件路径,支持:
|
||||
// - 空字符串:自动查找(config.json, ../config.json)
|
||||
// - 环境变量 DATABASE_URL:直接使用数据库URL
|
||||
// - migrationsDir: 迁移文件目录,支持:
|
||||
// - 空字符串:使用默认目录 "migrations"
|
||||
// - 相对路径或绝对路径
|
||||
// - command: 命令,支持 "up", "down", "status"
|
||||
//
|
||||
// 使用示例:
|
||||
//
|
||||
// // 最简单:使用默认配置和默认迁移目录
|
||||
// migration.RunMigrationsFromConfigWithCommand("", "", "up")
|
||||
//
|
||||
// // 指定配置文件,使用默认迁移目录
|
||||
// migration.RunMigrationsFromConfigWithCommand("config.json", "", "up")
|
||||
//
|
||||
// // 指定配置和迁移目录
|
||||
// migration.RunMigrationsFromConfigWithCommand("config.json", "scripts/sql", "up")
|
||||
//
|
||||
// // 使用环境变量
|
||||
// // DATABASE_URL="mysql://..." migration.RunMigrationsFromConfigWithCommand("", "migrations", "up")
|
||||
func RunMigrationsFromConfigWithCommand(configFile, migrationsDir, command string) error {
|
||||
// 加载配置
|
||||
cfg, err := loadConfigFromFileOrEnv(configFile)
|
||||
@@ -78,6 +73,11 @@ func RunMigrationsFromConfigWithCommand(configFile, migrationsDir, command strin
|
||||
return fmt.Errorf("连接数据库失败: %w", err)
|
||||
}
|
||||
|
||||
// 使用默认迁移目录(如果未指定)
|
||||
if migrationsDir == "" {
|
||||
migrationsDir = "migrations"
|
||||
}
|
||||
|
||||
// 创建迁移器
|
||||
migrator := NewMigrator(db)
|
||||
|
||||
@@ -152,6 +152,7 @@ func loadConfigFromFileOrEnv(configFile string) (*config.Config, error) {
|
||||
}
|
||||
|
||||
// connectDB 连接数据库
|
||||
// 与 factory.getDatabase 保持一致的实现,避免代码重复
|
||||
func connectDB(cfg *config.Config) (*gorm.DB, error) {
|
||||
if cfg.Database == nil {
|
||||
return nil, fmt.Errorf("数据库配置为空")
|
||||
@@ -178,15 +179,30 @@ func connectDB(cfg *config.Config) (*gorm.DB, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 配置连接池
|
||||
// 配置连接池(与 factory.getDatabase 保持一致)
|
||||
sqlDB, err := db.DB()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sqlDB.SetMaxOpenConns(10)
|
||||
sqlDB.SetMaxIdleConns(5)
|
||||
sqlDB.SetConnMaxLifetime(time.Hour)
|
||||
// 使用配置文件中的连接池参数,如果没有配置则使用默认值
|
||||
if cfg.Database.MaxOpenConns > 0 {
|
||||
sqlDB.SetMaxOpenConns(cfg.Database.MaxOpenConns)
|
||||
} else {
|
||||
sqlDB.SetMaxOpenConns(10) // 默认值
|
||||
}
|
||||
|
||||
if cfg.Database.MaxIdleConns > 0 {
|
||||
sqlDB.SetMaxIdleConns(cfg.Database.MaxIdleConns)
|
||||
} else {
|
||||
sqlDB.SetMaxIdleConns(5) // 默认值
|
||||
}
|
||||
|
||||
if cfg.Database.ConnMaxLifetime > 0 {
|
||||
sqlDB.SetConnMaxLifetime(time.Duration(cfg.Database.ConnMaxLifetime) * time.Second)
|
||||
} else {
|
||||
sqlDB.SetConnMaxLifetime(time.Hour) // 默认值
|
||||
}
|
||||
|
||||
return db, nil
|
||||
}
|
||||
@@ -213,4 +229,3 @@ func printMigrationStatus(status []MigrationStatus) {
|
||||
fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user