PostgreSQL: schema diff / patch tool [chiuso]


14

Considera la seguente impostazione:

  • Un DB di produzione
  • Un db di sviluppo, su cui vengono apportate modifiche allo schema per abilitare nuove funzionalità

Quando lo sviluppo di una nuova funzionalità è completo, devo aggiornare manualmente lo schema prod db fino pg_dump --schema-onlya quando su entrambi i DB è identico. Questo processo è soggetto a errori e noioso.

Quindi, sto cercando uno strumento in grado di:

  • Mostra un riepilogo delle differenze tra due schemi (come diff). Nota che non sto cercando una semplice differenza testuale dello schema, ma uno strumento più elaborato in grado di trarre conclusioni come "La tabella Xha una nuova colonna Y".
  • Generare automaticamente il codice SQL che converte uno schema in un altro (come patch)

Esiste uno strumento diff / patch di schema che può aiutarmi a convertire schemi di prod in schemi di sviluppo più avanzati?


2
Invece di fare un diff, dovresti gestire i tuoi script di migrazione in modo controllato. Non apportare mai modifiche DDL ad hoc a un DBMS, inserire sempre la modifica in uno script (che è archiviato in un sistema di controllo della versione) e quindi applicare lo script. Cerca strumenti come Liquibase o Flyway
a_horse_with_no_name

1
@a_horse_with_no_name Grazie. Anche con questo approccio, uno strumento diff / patch mi semplificherebbe la vita. A proposito, non posso fare a meno di canticchiare la canzone.
Adam Matan,

Potresti provare pg_comparator: pgfoundry.org/projects/pg-comparator (non l'ho mai usato però). Liquibase ha anche un diff incorporato ed emette i risultati come un changeset di Liquibase se non sbaglio, quindi potrebbe essere un buon punto di partenza per una gestione dello schema più controllata
a_horse_with_no_name

Grazie. Ti va di pubblicarlo come risposta per poter votare?
Adam Matan,

Risposte:


11

Scusa se resuscito una vecchia domanda

Recentemente ho utilizzato lo strumento di gestione del database DataGrip 0xDBE di JetBrains.

Supporta più motori di database, nell'eccellente IDE Jetbrains, e una caratteristica chiave che ho trovato utile è la possibilità di diff2 tabelle (DEV e PROD).

Di seguito è riportato uno screenshot del diff in azione (in questo caso c'è solo una differenza di colonna). Lo screenshot è il risultato del pulsante "Unisci a destra" nella parte superiore, che genera l'SQL necessario per portare a zero la tabella giusta.

0xDBE Diff. Tabella SQL

Spero che questo nuovo strumento aiuti.


3
Non vi è alcun problema con la risurrezione di vecchie domande (ci sono anche badge da raggiungere da quello). E una domanda: è possibile confrontare interi database (intendo, almeno, tutte le tabelle in essi)?
dezso

@dezso - Grazie per la rassicurazione. Sì, puoi confrontare a livello di database, schema e tabella.
Ewan,

1
@BasilBourque - Dal Databasemenu a sinistra , selezionare le 2 tabelle che si desidera confrontare (con cmd/ctrl + click), fare clic con il tasto destro e selezionareCompare
Ewan

3
Di recente mi sono imbattuto in un nuovo strumento, scritto in pitone, migra . Può tenere traccia delle modifiche alle modifiche a tabelle, viste, funzioni, indici, vincoli, enum, sequenze ed estensioni installate e può anche essere usato come libreria
script

1
@Ewan Inoltre, migra tiene traccia di tutto in entrambi i database, inclusi trigger e funzioni. Ma DataGrip no. Ecco perché, mi scoraggio dall'utilizzo di DataGrip come strumento diff. Svantaggi sono presenti anche: 1) migra è solo uno strumento PostgreSQL; 2) migra tiene traccia delle modifiche, ma non sempre produce operatori DDL appropriati, come alter table ... aggiungi colonna, elimina colonna invece di alter table ... rinomina colonna ecc. E non ho trovato nessuno strumento che produca comandi DDL corretti. Hanno sempre bisogno di lucidatura. Inoltre, senza alcuni strumenti di migrazione, come Liquibase, eventuali modifiche al database saranno troppo complesse.
Sterminatore: 13

6

Usa la liquibase .

Supporta diff , generando un db da zero, rattoppando un db, rollback di un db e un sacco di altre cose.

Prima dovevi scrivere tutto in XML con liquibase, ma non più. Puoi scriverne il 99% nel dialetto SQL di tua scelta. Esempio:

--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;

Dovresti tenere i log delle modifiche della liquibase in git o what-have-you.


Un problema con questo è che non ottiene correttamente l'ordinamento o la rimozione di vincoli e chiavi primarie.
monksy

2
Flyway è un'altra scelta simile a Liquibase.
Basil Bourque,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.