Verwendung von Tern-Migrationen im Go-Testcontainer mit Postgres

WBOY
Freigeben: 2024-02-06 11:42:04
nach vorne
695 Leute haben es durchsucht

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

Frageninhalt

Ich versuche, einen Integrationstest für meine Postgres-Datenbank zu schreiben. Dazu verwende ich einen Testcontainer in Go. Ich habe Tern-Migrationen in der eigentlichen Datenbank verwendet und die Migrationen im Migrationsordner abgelegt. Das Problem besteht darin, dass einige meiner Migrationen Eigenschaften in der Datei .tern.conf verwenden, da die Werte je nach Umgebung variieren können. Ich habe eine ähnliche Konfigurationsdatei local.tern.conf für lokal erstellt und versucht, globale Variablen festzulegen. Aber aus irgendeinem Grund werden die Werte nicht ausgewählt, wenn ich die Migration durchführe. Hier ist ein Beispiel -

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,
    }
}
Nach dem Login kopieren

Das ist Teil meiner Migration -

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

alter table {{.version_table}}
    owner to {{.master_user}};
.....
Nach dem Login kopieren

Das ist local.tern.conf-

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

[data]
 master_user = <user>
Nach dem Login kopieren


Richtige Antwort


Ich schätze, die Konfigurationsdatei muss auf den von testcontainers-go bereitgestellten zufälligen Port abzielen, anstatt auf den Standardport 5432 von Postgres. Möglicherweise müssen Sie diese Datei dynamisch mit der HostMappedPort-Methode des Containers generieren und dabei den Host und den zufälligen Port von testcontainers-go abrufen. Bitte beziehen Sie sich auf https://golang.testcontainers.org/features/networking/#, um den Container-Host zu erhalten

ip, _ := nginxC.Host(ctx)
port, _ := nginxC.MappedPort(ctx, "80")
_, _ = http.Get(fmt.Sprintf("http://%s:%s", ip, port.Port()))
Nach dem Login kopieren

Kannst du es versuchen?

Eine weitere Option ist die Verwendung von „Testcontainers Desktop“, die es ermöglicht, einen Port für einen bestimmten Dienst (Postgres) zu definieren, um alle Anfragen an diesen Port transparent an einen zufälligen Port weiterzuleiten. Bitte beachten Sie https://www.php.cn/link/9a4d6e8685bd057e4f68930bd7c8ecc0

Das obige ist der detaillierte Inhalt vonVerwendung von Tern-Migrationen im Go-Testcontainer mit Postgres. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage