调整迁移的逻辑
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
||||
"git.toowon.com/jimmy/go-common/email"
|
||||
"git.toowon.com/jimmy/go-common/logger"
|
||||
"git.toowon.com/jimmy/go-common/middleware"
|
||||
"git.toowon.com/jimmy/go-common/migration"
|
||||
"git.toowon.com/jimmy/go-common/sms"
|
||||
"git.toowon.com/jimmy/go-common/storage"
|
||||
"github.com/redis/go-redis/v9"
|
||||
@@ -764,3 +765,92 @@ func (f *Factory) GetMiddlewareChain() *middleware.Chain {
|
||||
|
||||
return middleware.NewChain(middlewares...)
|
||||
}
|
||||
|
||||
// RunMigrations 执行数据库迁移(黑盒模式,推荐使用)
|
||||
// 自动发现并执行指定目录下的所有迁移文件
|
||||
// migrationsDir: 迁移文件目录(如 "migrations" 或 "scripts/sql")
|
||||
//
|
||||
// 支持的文件命名格式:
|
||||
// - 数字前缀: 01_init_schema.sql
|
||||
// - 时间戳: 20240101000001_create_users.sql
|
||||
// - 带.up后缀: 20240101000001_create_users.up.sql
|
||||
//
|
||||
// 示例:
|
||||
//
|
||||
// fac, _ := factory.NewFactoryFromFile("config.json")
|
||||
// err := fac.RunMigrations("migrations")
|
||||
// if err != nil {
|
||||
// log.Fatal(err)
|
||||
// }
|
||||
func (f *Factory) RunMigrations(migrationsDir string) error {
|
||||
// 获取数据库连接
|
||||
db, err := f.getDatabase()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get database: %w", err)
|
||||
}
|
||||
|
||||
// 创建迁移器
|
||||
migrator := migration.NewMigrator(db)
|
||||
|
||||
// 自动发现并加载迁移文件
|
||||
migrations, err := migration.LoadMigrationsFromFiles(migrationsDir, "*.sql")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to load migrations: %w", err)
|
||||
}
|
||||
|
||||
if len(migrations) == 0 {
|
||||
f.LogInfo("在目录 '%s' 中没有找到迁移文件", migrationsDir)
|
||||
return nil
|
||||
}
|
||||
|
||||
migrator.AddMigrations(migrations...)
|
||||
|
||||
// 执行迁移
|
||||
if err := migrator.Up(); err != nil {
|
||||
return fmt.Errorf("failed to run migrations: %w", err)
|
||||
}
|
||||
|
||||
f.LogInfo("迁移执行成功: %d 个迁移文件", len(migrations))
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetMigrationStatus 获取迁移状态(黑盒模式,推荐使用)
|
||||
// migrationsDir: 迁移文件目录
|
||||
// 返回迁移状态列表,包含版本、描述、是否已应用等信息
|
||||
//
|
||||
// 示例:
|
||||
//
|
||||
// fac, _ := factory.NewFactoryFromFile("config.json")
|
||||
// status, err := fac.GetMigrationStatus("migrations")
|
||||
// if err != nil {
|
||||
// log.Fatal(err)
|
||||
// }
|
||||
// for _, s := range status {
|
||||
// fmt.Printf("Version: %s, Applied: %v\n", s.Version, s.Applied)
|
||||
// }
|
||||
func (f *Factory) GetMigrationStatus(migrationsDir string) ([]migration.MigrationStatus, error) {
|
||||
// 获取数据库连接
|
||||
db, err := f.getDatabase()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get database: %w", err)
|
||||
}
|
||||
|
||||
// 创建迁移器
|
||||
migrator := migration.NewMigrator(db)
|
||||
|
||||
// 加载迁移文件
|
||||
migrations, err := migration.LoadMigrationsFromFiles(migrationsDir, "*.sql")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to load migrations: %w", err)
|
||||
}
|
||||
|
||||
migrator.AddMigrations(migrations...)
|
||||
|
||||
// 获取状态
|
||||
status, err := migrator.Status()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get migration status: %w", err)
|
||||
}
|
||||
|
||||
return status, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user