You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Go Testcontainers中使用Tern迁移时配置变量未生效问题

解决Tern迁移在Testcontainers测试中无法读取配置变量的问题

问题根源

你当前使用migrate.NewMigrator创建迁移器时,该方法不会自动读取TERN_CONFIG环境变量或加载Tern配置文件,迁移文件里的模板变量(如{{.version_table}}、{{.master_user}})自然无法被替换。

修复步骤

  1. 加载Tern配置文件(优先读取TERN_CONFIG环境变量指定的路径,无指定时用兜底路径)
  2. 将配置中[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:07:29