PostgreSQL: schema diff / patch tool [ditutup]

14

Pertimbangkan pengaturan berikut:

  • DB produksi
  • A dev db, di mana perubahan skema dibuat untuk mengaktifkan fitur baru

Ketika pengembangan fitur baru selesai, saya harus memperbarui skema prod db secara manual sampai pg_dump --schema-onlypada kedua DB identik. Proses ini rawan kesalahan dan membosankan.

Jadi, saya mencari alat yang dapat:

  • Perlihatkan ringkasan perbedaan antara dua skema (seperti diff). Perhatikan bahwa saya tidak mencari perbedaan tekstual dari skema, tetapi alat yang lebih rumit yang dapat menarik kesimpulan seperti "Tabel Xmemiliki kolom baru Y".
  • Otomatis-menghasilkan kode SQL yang akan mengkonversi satu skema ke yang lain (seperti patch)

Apakah ada alat diff / patch skema yang dapat membantu saya mengonversi skema prod ke skema dev yang lebih maju?

Adam Matan
sumber
2
Daripada melakukan diff, Anda harus mengelola skrip migrasi Anda dengan cara yang terkontrol. Jangan pernah melakukan perubahan DDL ad-hoc ke DBMS, selalu masukkan perubahan ke dalam skrip (yang disimpan dalam sistem kontrol versi) dan kemudian terapkan skrip. Lihatlah alat-alat seperti Liquibase atau Flyway
a_horse_with_no_name
1
@a_horse_with_no_name Terima kasih. Bahkan dengan pendekatan ini, alat diff / patch akan membuat hidup saya lebih mudah. BTW, saya tidak bisa berhenti menyenandungkan lagunya.
Adam Matan
Anda dapat mencoba pg_comparator: pgfoundry.org/projects/pg-comparator (saya belum pernah menggunakannya). Liquibase memiliki built-in diff juga dan memancarkan hasilnya sebagai perubahan Liquibase jika saya tidak salah sehingga mungkin menjadi titik awal yang baik untuk lebih banyak manajemen skema terkontrol
a_horse_with_no_name
Terima kasih. Ingin mempostingnya sebagai jawaban agar saya dapat membatalkannya?
Adam Matan

Jawaban:

11

Maaf membangkitkan kembali pertanyaan lama

Baru-baru ini saya telah menggunakan 0xDBE DataGrip alat manajemen database oleh JetBrains.

Ini mendukung beberapa mesin basis data, dalam IDE Jetbrains yang luar biasa, dan fitur utama yang menurut saya berguna adalah kemampuan untuk diff2 tabel (DEV dan PROD).

Di bawah ini adalah tangkapan layar dari aksi diff (dalam hal ini hanya ada satu perbedaan kolom). Tangkapan layar adalah hasil dari tombol "Gabung Kanan" di bagian atas, menghasilkan SQL yang diperlukan untuk membawa tabel kanan ke awal.

0xDBE SQL Table Diff

Semoga alat baru ini membantu.

Ewan
sumber
3
Tidak ada masalah dengan membangkitkan kembali pertanyaan lama (bahkan ada lencana untuk dicapai dari itu). Dan pertanyaan: apakah mungkin untuk membandingkan seluruh database (maksud saya, setidaknya, semua tabel di dalamnya)?
dezso
@dezso - Terima kasih atas jaminannya. Ya, Anda dapat membandingkan di tingkat basis data, skema, dan tabel.
Ewan
Bagaimana cara memulai fitur diff di 0xDBE? Saya tidak dapat menemukan item menu untuk alat 'diff'.
Basil Bourque
1
@BasilBourque - Dari Databasemenu sebelah kiri , pilih 2 tabel yang ingin Anda bandingkan (dengan cmd/ctrl + click), klik kanan dan pilihCompare
Ewan
2
Saya baru-baru ini menemukan alat baru, ditulis dengan python, migra . Ia dapat melacak perubahan hingga perubahan pada tabel, tampilan, fungsi, indeks, batasan, enum, urutan, dan ekstensi yang diinstal dan juga dapat digunakan sebagai perpustakaan
skrip
6

Gunakan liquibase .

Ini mendukung diff , menghasilkan db dari awal, menambal db, mengembalikan db, dan banyak hal lainnya.

Anda dulu harus menulis semuanya dalam XML dengan liquibase, tetapi tidak lagi. Anda dapat menulis 99% dari itu dalam dialek SQL yang Anda pilih. Contoh:

--liquibase formatted sql

--changeset neil:1 

create table contacts(
  contact_id serial primary key,
  name text not null unique
);

--changeset neil:2
alter table contacts add column phone_num text;

Anda harus menyimpan changelog liquibase Anda di git atau apa pun.

Neil McGuigan
sumber
Masalah dengan ini adalah bahwa hal itu tidak mendapatkan urutan atau menghapus kendala dan kunci utama yang benar.
monksy
2
Jalur terbang adalah pilihan lain yang mirip dengan Liquibase.
Basil Bourque