Comparar la estructura de dos bases de datos PostgreSQL con pgAdmin 4
domingo, junio 14, 2020
En entradas anteriores explicaba cómo Comparar la estructura de dos Bases De Datos con DbWrench. En esta oportunidad voy a mostrar cómo hacerlo para bases de datos PostgreSQL sin necesidad de instalar ninguna herramienta extra.
Versiones más recientes de pgAdmin 4 incorporan una opción para comparar esquemas de bases de datos PostgreSQL. Esta utilidad lleva como nombre Schema Diff.
Inicialmente les comento que la versión que estoy usando de pgAdmin 4 es la 4.21 para Windows:

He creado dos bases de datos diferentes para demostrar la funcionalidad, una llamada movies y otra movies_copy.
La base de datos movies contiene solo dos tablas genres y series:
/* Tabla de Géneros */
CREATE TABLE public.genres
(
id serial NOT NULL,
name character varying NOT NULL,
CONSTRAINT genres_pkey PRIMARY KEY (id)
);
/* Tabla de Series */
CREATE TABLE public.series
(
id serial NOT NULL,
name character varying NOT NULL,
year character(4),
id_genre integer,
CONSTRAINT series_pkey PRIMARY KEY (id),
CONSTRAINT series_genres_fk FOREIGN KEY (id_genre)
REFERENCES public.genres (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID
);
Mientras que la base de datos movies_copy contiene tres tablas genres, series (con un cambio en el year) y movies:
/* Tabla de Géneros */
CREATE TABLE public.genres
(
id serial NOT NULL,
name character varying NOT NULL,
CONSTRAINT genres_pkey PRIMARY KEY (id)
);
/* Tabla de Series */
CREATE TABLE public.series
(
id serial NOT NULL,
name character varying NOT NULL,
year character(5),
id_genre integer,
CONSTRAINT series_pkey PRIMARY KEY (id),
CONSTRAINT series_genres_fk FOREIGN KEY (id_genre)
REFERENCES public.genres (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID
);
/* Tabla de Películas */
CREATE TABLE public.movies
(
id integer serial NOT NULL,
name character varying NOT NULL,
year character(4),
id_genre integer,
CONSTRAINT movies_pkey PRIMARY KEY (id),
CONSTRAINT movies_genres_fk FOREIGN KEY (id_genre)
REFERENCES public.genres (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
);
Para hacer la comparación solo tenemos que ir al menú Tools -> Schema Diff:

Luego seleccionar las opciones que correspondan en Select Source y Select Target, y hacer click en Compare. Podremos ir explorando las diferencias encontradas.
- Schema Diff - Nueva Secuencia de Tabla movies encontrada:

- Schema Diff - Nueva Tabla movies encontrada:

- Schema Diff - Diferencia en estructura de Tabla series:

Finalmente podemos generar un Script con los cambios encontrados seleccionando todos los items que queremos que sean incluidos y haciendo click en Generate Script:

El Script generado quedaría de la siguiente manera:
-- This script was generated by a beta version of the Schema Diff utility in pgAdmin 4.
-- This version does not include dependency resolution, and may require manual changes
-- to the script to ensure changes are applied in the correct order.
-- Please report an issue for any failure with the reproduction steps.
BEGIN;
CREATE SEQUENCE public.movies_id_seq
INCREMENT 1
START 1
MINVALUE 1
MAXVALUE 2147483647
CACHE 1;
ALTER SEQUENCE public.movies_id_seq
OWNER TO postgres;
CREATE TABLE public.movies
(
id integer NOT NULL DEFAULT nextval('movies_id_seq'::regclass),
name character varying COLLATE pg_catalog."default" NOT NULL,
year character(4) COLLATE pg_catalog."default",
id_genre integer,
CONSTRAINT movies_pkey PRIMARY KEY (id),
CONSTRAINT movies_genres_fk FOREIGN KEY (id_genre)
REFERENCES public.genres (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
TABLESPACE pg_default;
ALTER TABLE public.movies
OWNER to postgres;
-- WARNING:
-- The SQL statement below would normally be used to alter the datatype for the id column, however,
-- the current datatype cannot be cast to the target datatype so this conversion cannot be made automatically.
-- ALTER TABLE public.series
-- ALTER COLUMN id TYPE integer;
ALTER TABLE public.series
ALTER COLUMN year TYPE character(5) COLLATE pg_catalog."default";
CREATE INDEX "None"
ON public.series(id_genre);
END;
De esta manera logramos comparar la estructura de dos Bases de Datos PostgreSQL únicamente usando la herramienta que nos brinda pgAdmin 4. Espero pueda ser de utilidad y comenta ¿qué te pareció esta funcionalidad? ¿la conocías?.






























viviendo en Argentina
. Me encanta aprender cada día algo nuevo y compartir conocimientos con otros. ¡Bienvenidos!