Maison > développement back-end > Golang > le corps du texte

Utilisation des migrations tern dans le conteneur de test Go avec Postgres

WBOY
Libérer: 2024-02-06 11:42:04
avant
708 Les gens l'ont consulté

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

Contenu de la question

J'essaie d'écrire un test d'intégration pour ma base de données Postgres. Pour ce faire, j'utilise un conteneur de test dans Go. J'ai utilisé les migrations tern dans la base de données réelle et placé les migrations dans le dossier migrations. Le problème est que certaines de mes migrations utilisent des propriétés du fichier .tern.conf car les valeurs peuvent varier selon l'environnement. J'ai créé un fichier de configuration similaire local.tern.conf pour les variables locales et essayé de définir des variables globales. Mais pour une raison quelconque, lorsque j'exécute la migration, les valeurs ne sont pas sélectionnées. Voici un exemple -

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,
    }
}
Copier après la connexion

Cela fait partie de ma migration -

....
CREATE TABLE {{.version_table}} (
    version integer NOT NULL
);

alter table {{.version_table}}
    owner to {{.master_user}};
.....
Copier après la connexion

C'est local.tern.conf-

[database]
 host = <host>
 port = 5432
 database = <db name>
 version_table = schema_version_table

[data]
 master_user = <user>
Copier après la connexion


Bonne réponse


Je suppose que le fichier de configuration doit cibler le port aléatoire fourni par testcontainers-go au lieu du port 5432 par défaut de Postgres. Vous devrez peut-être générer ce fichier dynamiquement en utilisant la méthode HostMappedPort du conteneur, en obtenant l'hôte et le port aléatoire de testcontainers-go. Veuillez vous référer à https://golang.testcontainers.org/features/networking/# pour obtenir l'hôte du conteneur

ip, _ := nginxC.Host(ctx)
port, _ := nginxC.MappedPort(ctx, "80")
_, _ = http.Get(fmt.Sprintf("http://%s:%s", ip, port.Port()))
Copier après la connexion

Peux-tu l'essayer ?

Une autre option consiste à utiliser "Testcontainers Desktop" qui permet de définir un port pour un service donné (postgres) afin de transmettre de manière transparente toute demande adressée à ce port à un port aléatoire. Veuillez vous référer à https://www.php.cn/link/9a4d6e8685bd057e4f68930bd7c8ecc0

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal