Publicidad

Crear datos de pruebas en postgreSQL


Por Alex el 31/01/2025, Comentar el artículo

Comparte este artículo:      




Tanto en postgreSQL como en otros gestores de base de datos hay veces que necesitamos llenar tablas con datos de pruebas. En este artículo os dejo una query y un procedimiento de como hacerlo de forma fácil ...




1) Preparar el entorno

Cada uno de vosotros tenéis vuestro propio entorno y casuisticas pero para que veáis el procedimiento voy a crear una tabla simple que iré ampliando

CREATE TABLE ejemplo_fechas (
    id SERIAL PRIMARY KEY,
    fecha TIMESTAMP,
    year INTEGER
);

Con esta table de ejemplo de fechas vamos a crear fechas aleatorias

2) Generar valores aleatorios para fechas

Con la siguiente query se pueden generar datos aleatorios:

INSERT INTO ejemplo_fechas (fecha, year)
SELECT
    NOW() + (i || ' days')::INTERVAL,
    EXTRACT(YEAR FROM NOW() + (i || ' days')::INTERVAL)::INTEGER
FROM generate_series(1, 1000000) i;


con la funcion de postgreSQL generate_series() podemos generar datos del tipo int, bigint, numeric, timestamp o timestamp with time zone (timestamptz) en una tabla para pruebas.

Pero podemos hacer mas

3) Generar valores aleatorios para nombres

Modificamos la tabla inicial de ejemplo para añadir un nombre y un boleano

ALTER TABLE ejemplo_fechas
ADD COLUMN nombre TEXT,
ADD COLUMN enabled BOOLEAN;

Eliminamos el contenido anterior

truncate table ejemplo_fechas;

Ahora modificamos la query para insertar datos aleatorios en esos campos nuevos también

INSERT INTO ejemplo_fechas (fecha, year, nombre, enabled)
SELECT
    NOW() + (i || ' days')::INTERVAL,
    EXTRACT(YEAR FROM NOW() + (i || ' days')::INTERVAL)::INTEGER,
    'Nombre_' || i,                -- Nombre dinámico basado en el número
    (i % 2 = 0)                    -- Alterna entre TRUE y FALSE (enabled)
FROM generate_series(1, 1000000) i;

Pero ... supongamos que tenemos una tabla con nombres

4) Generar valores aleatorios desde otras tablas

Bueno, en este caso no la tengo pero la creo para el ejemplo

CREATE TABLE nombres_predefinidos (
    id SERIAL PRIMARY KEY,
    nombre TEXT
);

He inserto unos nombres

INSERT INTO nombres_predefinidos (nombre) VALUES
('Juan'), ('María'), ('Pedro'), ('Ana'), ('Luis');

Eliminamos el contenido anterior

truncate table ejemplo_fechas;

Nuestra consulta anterior aleatoria quedaría de la siguiente forma utilizando esta tabla de nombres:

INSERT INTO ejemplo_fechas (fecha, year, nombre, enabled)
WITH RECURSIVE nombres_aleatorios AS (
    SELECT nombre, row_number() OVER (ORDER BY random()) as rn 
    FROM nombres_predefinidos
)
SELECT
    NOW() + (i || ' days')::INTERVAL,
    EXTRACT(YEAR FROM NOW() + (i || ' days')::INTERVAL)::INTEGER,
    nombres_aleatorios.nombre,
    (i % 2 = 0)
FROM generate_series(1, 1000000) i
CROSS JOIN nombres_aleatorios
WHERE nombres_aleatorios.rn = 1 + (i % (SELECT COUNT(*) FROM nombres_predefinidos));

Si la tabla de nombres que tenemos es pequeña y no queremos liarnos con una tabla también podemos hacerlo con un array

INSERT INTO ejemplo_fechas (fecha, year, nombre, enabled)
SELECT
    NOW() + (i || ' days')::INTERVAL,
    EXTRACT(YEAR FROM NOW() + (i || ' days')::INTERVAL)::INTEGER,
    (ARRAY['Juan', 'María', 'Pedro', 'Ana', 'Luis'])[floor(random() * 5 + 1)], 
    (i % 2 = 0)
FROM generate_series(1, 1000000) i;


5) Conclusión

Como podemos ver es relativamente sencillo llenar una tabla con datos de pruebas con la función generate_series que no será difícil adaptara vuestras tablas.

Y esto es todo, feliz programming!!!
Saludos
Alex
:-)
/


Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN


ARCHIVO

Publicidad

.