>  기사  >  백엔드 개발  >  Postgres를 사용하여 Go 테스트 컨테이너에서 tern 마이그레이션 사용

Postgres를 사용하여 Go 테스트 컨테이너에서 tern 마이그레이션 사용

WBOY
WBOY앞으로
2024-02-06 11:42:04681검색

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

질문 내용

Postgres 데이터베이스에 대한 통합 테스트를 작성하려고 합니다. 이를 위해 Go에서 테스트 컨테이너를 사용합니다. 실제 데이터베이스에서 tern 마이그레이션을 사용하고 마이그레이션을 마이그레이션 폴더에 배치했습니다. 문제는 환경에 따라 값이 달라질 수 있기 때문에 일부 마이그레이션에서 .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에서 제공하는 임의의 포트를 대상으로 해야 한다고 생각합니다. testcontainers-go에서 호스트와 임의의 포트를 가져와 컨테이너의 HostMappedPort 메서드를 사용하여 이 파일을 동적으로 생성해야 할 수도 있습니다. 컨테이너 호스트를 얻으려면 https://golang.testcontainers.org/features/networking/#을 참조하세요

으아악

한번 해볼래?

또 다른 옵션은 특정 서비스(postgres)에 대한 포트를 정의하여 해당 포트에 대한 모든 요청을 무작위 포트로 투명하게 프록시할 수 있는 "Testcontainers Desktop"을 사용하는 것입니다. https://www.php.cn/link/9a4d6e8685bd057e4f68930bd7c8ecc0

를 참고하세요

위 내용은 Postgres를 사용하여 Go 테스트 컨테이너에서 tern 마이그레이션 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제