在Go Testcontainers中使用Tern迁移时配置变量未生效问题
解决Tern迁移在Testcontainers测试中无法读取配置变量的问题
问题根源
你当前使用migrate.NewMigrator创建迁移器时,该方法不会自动读取TERN_CONFIG环境变量或加载Tern配置文件,迁移文件里的模板变量(如{{.version_table}}、{{.master_user}})自然无法被替换。
修复步骤
- 加载Tern配置文件(优先读取
TERN_CONFIG环境变量指定的路径,无指定时用兜底路径) - 将配置中
[data]段的内容注入到迁移器的模板数据中
修改后的代码
import ( "github.com/jackc/tern/v2/config" // 保留你原有的其他导入 ) func SetupTestDatabase() *TestDatabase { // 加载Tern配置文件 cfgPath := os.Getenv("TERN_CONFIG") if cfgPath == "" { cfgPath = "../local.tern.conf" // 兜底路径可根据项目结构调整 } cfg, err := config.Load(cfgPath) if err != nil { zap.S().Fatal("failed to load tern config", err) } // 初始化测试数据库容器 ctx, cancel := context.WithTimeout(context.Background(), time.Second*60) defer cancel() container, dbInstance, dbAddr, err := createContainer(ctx) if err != nil { zap.S().Fatal("failed to setup test", err) } conn, _ := dbInstance.Acquire(ctx) // 用配置中的版本表名称创建迁移器,避免硬编码 m, err := migrate.NewMigrator(ctx, conn.Conn(), cfg.Database.VersionTable) if err != nil { zap.S().Fatal("failed to setup migrator", err) } // 核心:将配置的[data]段变量注入迁移模板 m.TemplateData = cfg.Data if err := m.LoadMigrations("../migrations"); err != nil { zap.S().Fatal("failed to load migrations", err) return nil } if len(m.Migrations) == 0 { zap.S().Fatal("no migrations found") return nil } if err := m.Migrate(ctx); err != nil { zap.S().Fatal("failed to migrate", err) return nil } return &TestDatabase{ container: container, DbInstance: dbInstance, DbAddress: dbAddr, } }
关键说明
config.Load()会自动解析Tern配置文件的[database]和[data]段内容m.TemplateData = cfg.Data是解决变量不替换的核心步骤,配置里的master_user等变量会被传入迁移模板- 迁移器的版本表直接使用配置中的值,保持和生产环境配置一致,避免硬编码差异
内容的提问来源于stack exchange,提问作者mistermims
相关产品推荐
相关产品推荐

