ホームページ  >  記事  >  バックエンド開発  >  postgresを使用したgoテストコンテナでternマイグレーションを使用する

postgresを使用したgoテストコンテナでternマイグレーションを使用する

WBOY
WBOY転載
2024-02-06 11:42:04699ブラウズ

在带有 postgres 的 go test 容器中使用 tern 迁移

質問の内容

Postgres データベースの統合テストを作成しようとしています。これを行うには、Go のテスト コンテナーを使用します。実際のデータベースで tern のマイグレーションを使用し、マイグレーションを migrations フォルダーに配置しました。問題は、値が環境によって異なる可能性があるため、移行の一部で .tern.conf ファイル内のプロパティを使用することです。ローカル用に同様の設定ファイル local.tern.conf を作成し、グローバル変数を設定してみました。しかし、何らかの理由で移行を実行すると値が選択されません。これが例です-

リーリー

これは私の移行の一部です -

リーリー

これは local.tern.conf-

です
func SetupTestDatabase() *TestDatabase {
    // Set the TERN_CONFIG environment variable to the path of your local.tern.conf file
    if err := os.Setenv("TERN_CONFIG", "../local.tern.conf"); err != nil {
        // Handle error if setting the environment variable fails
        zap.S().Fatal("failed to set TERN_CONFIG", err)
    }

    // setup db container
    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(), "schema_version_table")
    if err != nil {
        zap.S().Fatal("failed to setup migrator", err)
    }

    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,
    }
}

正解


設定ファイルは、Postgresのデフォルトの5432ポートではなく、testcontainers-goによって提供されるランダムなポートをターゲットにする必要があると思います。コンテナの Host メソッドと MappedPort メソッドを使用して、testcontainers-go からホストとランダム ポートを取得して、このファイルを動的に生成する必要がある場合があります。 https://golang.testcontainers.org/features/networking /#コンテナ ホストの取得を参照してください

リーリー

試してみてもらえますか?

もう 1 つのオプションは、「Testcontainers Desktop」を使用することです。これにより、特定のサービス (postgres) のポートを定義して、そのポートへのリクエストをランダムなポートに透過的にプロキシすることができます。 https://www.php.cn/link/9a4d6e8685bd057e4f68930bd7c8ecc0

を参照してください。

以上がpostgresを使用したgoテストコンテナでternマイグレーションを使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。