Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan migrasi tern dalam bekas ujian go dengan postgres

Menggunakan migrasi tern dalam bekas ujian go dengan postgres

WBOY
WBOYke hadapan
2024-02-06 11:42:04628semak imbas

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

Kandungan soalan

Saya cuba menulis ujian penyepaduan untuk pangkalan data Postgres saya. Untuk melakukan ini, saya menggunakan bekas ujian dalam Go. Saya telah menggunakan migrasi tern dalam pangkalan data sebenar dan meletakkan migrasi dalam folder migrasi. Masalahnya ialah beberapa migrasi saya menggunakan sifat dalam fail .tern.conf kerana nilai mungkin berbeza bergantung pada persekitaran. Saya mencipta fail konfigurasi serupa local.tern.conf untuk setempat dan cuba menetapkan pembolehubah global. Tetapi atas sebab tertentu apabila saya menjalankan migrasi nilai tidak dipilih. Berikut adalah contoh -

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

Ini adalah sebahagian daripada penghijrahan saya -

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

alter table {{.version_table}}
    owner to {{.master_user}};
.....

Ini local.tern.conf-

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

[data]
 master_user = <user>

Jawapan betul


Saya rasa fail konfigurasi perlu menyasarkan port rawak yang disediakan oleh testcontainers-go dan bukannya port 5432 lalai Postgres. Anda mungkin perlu menjana fail ini secara dinamik menggunakan kaedah HostMappedPort bekas, mendapatkan hos dan port rawak daripada testcontainers-go. Sila rujuk https://golang.testcontainers.org/features/networking/# untuk mendapatkan hos kontena

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

Bolehkah anda mencubanya?

Pilihan lain ialah menggunakan "Testcontainers Desktop" yang membenarkan penentuan port untuk perkhidmatan tertentu (postgres) untuk proksi secara telus sebarang permintaan ke port tersebut ke port rawak. Sila rujuk https://www.php.cn/link/9a4d6e8685bd057e4f68930bd7c8ecc0

Atas ialah kandungan terperinci Menggunakan migrasi tern dalam bekas ujian go dengan postgres. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam