Menggunakan migrasi tern dalam bekas ujian go dengan postgres

WBOY
Lepaskan: 2024-02-06 11:42:04
ke hadapan
697 orang telah melayarinya

在带有 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,
    }
}
Salin selepas log masuk

Ini adalah sebahagian daripada penghijrahan saya -

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

alter table {{.version_table}}
    owner to {{.master_user}};
.....
Salin selepas log masuk

Ini local.tern.conf-

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

[data]
 master_user = <user>
Salin selepas log masuk


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()))
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan