PostgreSQL: herramienta de esquema / parche de esquema [cerrado]

14

Considere la siguiente configuración:

  • Un DB de producción
  • Una base de datos de desarrollo, en la que se realizan cambios de esquema para habilitar nuevas funciones

Cuando se completa el desarrollo de una nueva característica, tengo que actualizar manualmente el esquema prod db hasta que pg_dump --schema-onlyambos DB sean idénticos. Este proceso es propenso a errores y tedioso.

Entonces, estoy buscando una herramienta que pueda:

  • Muestra un resumen de las diferencias entre dos esquemas (como diff). Tenga en cuenta que no estoy buscando una simple diferencia textual del esquema, sino una herramienta más elaborada que pueda sacar conclusiones como "La tabla Xtiene una nueva columna Y".
  • Genere automáticamente el código SQL que convertiría un esquema en otro (como patch)

¿Hay un esquema diff / parche herramienta que me puede ayudar a convertir los esquemas prod a los esquemas más avanzados dev?

Adam Matan
fuente
2
En lugar de hacer una diferencia, debe administrar sus scripts de migración de forma controlada. Nunca realice cambios DDL ad-hoc en un DBMS, siempre coloque el cambio en un script (que se almacena en un sistema de control de versiones) y luego aplique el script. Busque herramientas como Liquibase o Flyway
a_horse_with_no_name
1
@a_horse_with_no_name Gracias. Incluso con este enfoque, una herramienta diff / patch me facilitaría la vida. Por cierto, no puedo evitar tararear la canción.
Adam Matan
Puede probar pg_comparator: pgfoundry.org/projects/pg-comparator (aunque nunca lo he usado). Liquibase ha incorporado un diff así y emite los resultados como un conjunto de cambios Liquibase si no estoy equivocado, así que puede ser un buen punto de partida para más de un esquema de gestión controlada
a_horse_with_no_name
Gracias. ¿Te importaría publicarlo como respuesta para que pueda votar?
Adam Matan

Respuestas:

11

Perdón por resucitar una vieja pregunta

Recientemente he estado usando la herramienta de gestión de base de datos 0xDBE DataGrip de JetBrains.

Es compatible con múltiples motores de base de datos, en el excelente IDE de Jetbrains, y una característica clave que he encontrado útil es la capacidad de diff2 tablas (DEV y PROD).

A continuación se muestra una captura de pantalla de la diferencia en acción (en este caso, solo hay una diferencia de columna). La captura de pantalla es el resultado del botón "Combinar a la derecha" en la parte superior, que genera el SQL necesario para que la tabla correcta funcione desde cero.

0xDBE Diferencia de tabla SQL

Espero que esta nueva herramienta ayude.

Ewan
fuente
3
No hay problema con resucitar viejas preguntas (incluso hay insignias para lograr de eso). Y una pregunta: ¿es posible comparar bases de datos completas (quiero decir, al menos, todas las tablas en ellas)?
dezso
@dezso - Gracias por la tranquilidad. Sí, puede comparar a nivel de base de datos, esquema y tabla.
Ewan
1
@BasilBourque: desde el Databasemenú de la izquierda , seleccione las 2 tablas que desea comparar (con cmd/ctrl + click), haga clic derecho y seleccioneCompare
Ewan
3
Recientemente me encontré con una nueva herramienta, escrita en python, migra . Puede realizar un seguimiento de los cambios en las tablas, vistas, funciones, índices, restricciones, enumeraciones, secuencias y extensiones instaladas, y también se puede utilizar como una biblioteca
scripts del
1
@Ewan Además, migra rastrea todo en ambas bases de datos, incluidos desencadenantes y funciones. Pero DataGrip no lo hace. Por eso, desaconsejo usar DataGrip como una herramienta de diferencias. También hay inconvenientes: 1) migra es solo una herramienta PostgreSQL; 2) migra hace un seguimiento de los cambios, pero no siempre produce operadores DDL apropiados, como alterar tabla ... agregar columna, soltar columna en lugar de alterar tabla ... cambiar nombre de columna, etc. Y no he encontrado ninguna herramienta que produzca comandos DDL correctos. Siempre necesitan pulirse. Además, sin alguna herramienta de migración, como Liquibase, cualquier modificación de la base de datos será demasiado compleja.
Exterminator13
6

Usa liquibase .

Es compatible con diff , generando una base de datos desde cero, parcheando una base de datos, haciendo retroceder una base de datos y un montón de otras cosas.

Solía ​​tener que escribir todo en XML con liquibase, pero ya no. Puede escribir el 99% en el dialecto SQL que elija. Ejemplo:

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

Debe mantener sus registros de cambios de liquibase en git o what-have-you.

Neil McGuigan
fuente
Un problema con esto es que no consigue ordenar o eliminar restricciones y claves principales correctamente.
Monksy
2
Flyway es otra opción similar a Liquibase.
Basil Bourque