Que vamos ver en este artículo
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
:-)
/