Saya mencoba untuk memigrasi tes unit saya dari H2 ke Postgresql.
Saat ini, H2 memberi saya skema dalam memori sehingga setiap koneksi memetakan ke skema unik, membuat tabel, menjalankan tes, dan menjatuhkan skema. Pembuatan dan penghancuran skema ditangani secara otomatis oleh H2.
Tes unit berjalan bersamaan.
Apa cara terbaik untuk melakukan ini di Postgresql? Secara khusus,
- Bagaimana cara mendapatkan skema unik per koneksi?
- Haruskah kerangka pengujian menghasilkan nama unik atau apakah ada mekanisme bawaan untuk melakukan ini?
- Bagaimana cara saya memastikan bahwa skema dibatalkan ketika koneksi terputus?
- Saya tidak ingin berakhir dengan skema menggantung ketika tes unit terbunuh.
- Pendekatan apa yang akan menghasilkan kinerja tertinggi?
- Saya perlu membuat / menjatuhkan puluhan skema per detik.
UPDATE : Saya menemukan jawaban terkait di sini tetapi gagal untuk menjatuhkan skema jika proses menjalankan tes unit terbunuh.
sumber
pg_temp
apakah satu skema itu benar? Jadi ketika saya menjalankan tes unit bersamaan, tidakkah mereka akan saling menghancurkan tabel / data masing-masing?SET search_path
; gunakanSET LOCAL search_path
untuk mengatur per subtransaksi, atau jika Anda ingin, Anda dapat mengatur di tingkat pengguna denganALTER USER mytestuser SET search_path = 'pg_temp'
, atau di tingkat basis data denganALTER DATABASE mytestdb SET search_path = 'pg_temp'
pg_temp
skema ini?Anda bisa mendapatkan nama skema sementara saat ini (setelah membuat tabel temp pertama) seperti diletakkan di tautan yang Anda tambahkan:
Tetapi rencana Anda saat ini masih tidak masuk akal. Untuk membuat tabel dalam skema sementara saat ini, cukup buat tabel sementara. Itu saja. Secara default,
search_path
ini didefinisikan sehingga tabel sementara terlihat pertama. Satu tidak pernah perlu skema-kualifikasi tabel temp. Anda seharusnya tidak perlu menangani skema sementara saat ini secara langsung dengan cara apa pun - itu adalah detail implementasi.sumber
If you're explicitly sequences ...
Saya pikir komentar terakhir Anda berisi salah ketik. Apa yang ingin Anda katakan antaraexplicitly
dansequences
?Apakah tes Anda melibatkan transaksi? DDL bersifat transaksional dalam PostgreSQL, jadi jika Anda membuat skema dan tabel Anda, kemudian jalankan tes Anda, semuanya dalam satu transaksi yang kemudian dibatalkan, skema tersebut tidak pernah benar-benar dilakukan dan terlihat oleh sesi lain.
Anda masih perlu menggunakan nama yang mungkin unik untuk skema Anda (mungkin menyertakan nama host dan PID), karena
CREATE SCHEMA
akan segera gagal jika skema yang dinamai identik sudah ada, dan akan diblokir jika sesi lain telah membuat skema yang bernama identik di transaksi yang tidak terikat.Alternatifnya mungkin hanya menggunakan tabel sementara, jika Anda dapat memodifikasi skrip pembuatan basis data Anda untuk melakukan itu.
sumber
CREATE SCHEMA
ini adalah satu-satunya yang dapat menjamin mereka menghilang ketika tes unit terbunuh.Saya baru saja mendapat ide.
Postgresql menjamin bahwa suatu sesi tidak dapat melihat tabel sementara orang lain. Saya menduga ini berarti bahwa ketika Anda membuat tabel sementara, itu membuat skema sementara. Jadi mungkin saya bisa melakukan hal berikut:
Saya tidak suka mengandalkan detail implementasi, tetapi dalam hal ini sepertinya cukup aman.
sumber