Comparar la estructura de dos bases de datos PostgreSQL con pgAdmin 4

domingo, junio 14, 2020
Logo PostgreSQL

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.

  1. Schema Diff - Nueva Secuencia de Tabla movies encontrada:
  2. Schema Diff - Nueva Tabla movies encontrada:
  3. Schema Diff - Diferencia en estructura de Tabla series:

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

También te puede interesar

Cuando navego por los sitios web, mi parte favorita es leer los comentarios. Es por eso que tus comentarios son un complemento valioso para mis entradas. Cualquier duda o aporte no dejes de escribirlo, en breve lo estaré publicando. ¡Gracias!


1 comentarios

Lo más reciente

¡Bendiciones para mi Venezuela!

¡Bendiciones para mi Venezuela!