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?.