Hoy te mostraré una idea o prototipo de un generador para llenar bases de datos SQL usando el lenguaje de programación JavaScript. Básicamente es como un faker, seeder o generador de datos aleatorios para llenar bases de datos.
Recientemente tuve la necesidad de generar datos falsos para mi programa de renta de consolas de juegos por tiempo, y como era algo rápido decidí crear un pequeño script para la tarea.
Con lo que te mostraré espero que te puedas dar una idea de cómo hacer el tuyo y ver qué tan fácil es. Igualmente puedes usarlo como base para tu propio script.
El script que hice solo llenaba una tabla de la base de datos, misma que tiene las siguientes columnas:
Como puedes ver tiene algunas columnas que son de fechas.
Lo que necesitamos para tener datos aleatorios son funciones que nos den números aleatorios. En mi blog ya tengo una función para generar números aleatorios:
const obtenerNumeroAleatorioEnRango = (min, max) => {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
Y ya con esa función podemos tener otras funciones, por ejemplo, la de la fecha aleatoria en donde creamos un objeto de tipo Date
con año, mes, día, hora, minutos y segundos aleatorios usando la función anterior:
const obtenerNumeroAleatorioEnRango = (min, max) => {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
const fechaAleatoria = () => {
const fecha = new Date(obtenerNumeroAleatorioEnRango(2020, 2021), obtenerNumeroAleatorioEnRango(0, 11), obtenerNumeroAleatorioEnRango(1, 28), obtenerNumeroAleatorioEnRango(0, 23), obtenerNumeroAleatorioEnRango(0, 59), obtenerNumeroAleatorioEnRango(0, 59));
return fecha;
}
const obtenerCadenaFecha = (fecha) => {
const mes = fecha.getMonth() + 1; // Ya que los meses los cuenta desde el 0
const dia = fecha.getDate();
const cadenaFecha = `${fecha.getFullYear()}-${agregarCeroSiEsNecesario(mes)}-${agregarCeroSiEsNecesario(dia)}`;
const cadenaHora = `${agregarCeroSiEsNecesario(fecha.getHours())}:${agregarCeroSiEsNecesario(fecha.getMinutes())}:${agregarCeroSiEsNecesario(fecha.getSeconds())}`;
return cadenaFecha + "T" + cadenaHora;
}
const agregarCeroSiEsNecesario = (valor) => {
if (valor < 10) {
return '0'.concat(valor);
}
return valor.toString();
}
Además de las funciones para generar los datos tenemos otras ayudantes para formatear la fecha y cosas de ese tipo.
Ahora veamos cómo generar datos aleatorios para nuestra base de datos. Basta con concatenar una cadena dentro de un ciclo y generar los datos aleatorios.
let cadena = `INSERT INTO dispositivos_rentados
(id_dispositivo, inicio, fin, costo, costo_productos, es_tiempo_libre, cobrado, segundos_pausa, fecha_pausa)
VALUES `;
const cantidadRegistros = 10;
for (let x = 0; x < cantidadRegistros; x++) {
const idDispositivo = obtenerNumeroAleatorioEnRango(1, 5);
const inicio = fechaAleatoria();
const fin = new Date(inicio.getTime() + (obtenerNumeroAleatorioEnRango(1, 600) * 60 * 1000));
const inicioFormateado = obtenerCadenaFecha(inicio);
const finFormateado = obtenerCadenaFecha(fin);
const costo = obtenerNumeroAleatorioEnRango(1, 1000);
const costoProductos = obtenerNumeroAleatorioEnRango(1, 1000);
const esTiempoLibre = obtenerNumeroAleatorioEnRango(0, 1);
const cobrado = 1;
const segundosPausa = obtenerNumeroAleatorioEnRango(0, 100);
const fechaPausa = "";
cadena += `
("${idDispositivo}","${inicioFormateado}", "${finFormateado}", ${costo}, ${costoProductos}, ${esTiempoLibre}, ${cobrado}, ${segundosPausa},"${fechaPausa}")`;
if (x + 1 < cantidadRegistros) {
cadena += ",";
} else {
cadena += ";";
}
}
console.log(cadena);
La concatenación se está haciendo en la línea 18 (usando también las backticks), mientras que la cantidad de registros se controla en la línea 5.
Al ejecutar el script, genera lo siguiente:
Como puedes ver, son datos aleatorios pero cumplen con la sintaxis para ser importados a una base de datos.
Nota: en este caso ejecuté el script del lado del servidor con Node, pero funciona de la misma manera en el navegador web.
Ahora que ya tenemos nuestro generador podemos redireccionar su salida a un archivo. Por ejemplo, voy a generar 5000 datos aleatorios y guardarlos en un archivo con:
node generador.js > datos.sql
Nota: si usas JS del lado del cliente no podrás redireccionar la salida ya que no es un comando, en su lugar tal vez quieras generar un archivo desde JS.
Ahora que ya tienes el archivo puedes importarlo a cualquier motor como MySQL o SQLite. Yo lo he usado para SQLite3 y funcionó perfectamente.
Con esto ya puedes generar tus propios datos aleatorios ya sean cadenas, fechas, números, etcétera. Obviamente esto solo es un pequeño ejemplo rápido.
Te dejo con el código completo del generador:
/**
* https://parzibyte.me/blog
*/const obtenerNumeroAleatorioEnRango = (min, max) => {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
const fechaAleatoria = () => {
const fecha = new Date(obtenerNumeroAleatorioEnRango(2020, 2021), obtenerNumeroAleatorioEnRango(0, 11), obtenerNumeroAleatorioEnRango(1, 28), obtenerNumeroAleatorioEnRango(0, 23), obtenerNumeroAleatorioEnRango(0, 59), obtenerNumeroAleatorioEnRango(0, 59));
return fecha;
}
const obtenerCadenaFecha = (fecha) => {
const mes = fecha.getMonth() + 1; // Ya que los meses los cuenta desde el 0
const dia = fecha.getDate();
const cadenaFecha = `${fecha.getFullYear()}-${agregarCeroSiEsNecesario(mes)}-${agregarCeroSiEsNecesario(dia)}`;
const cadenaHora = `${agregarCeroSiEsNecesario(fecha.getHours())}:${agregarCeroSiEsNecesario(fecha.getMinutes())}:${agregarCeroSiEsNecesario(fecha.getSeconds())}`;
return cadenaFecha + "T" + cadenaHora;
}
const agregarCeroSiEsNecesario = (valor) => {
if (valor < 10) {
return '0'.concat(valor);
}
return valor.toString();
}
let cadena = `INSERT INTO dispositivos_rentados
(id_dispositivo, inicio, fin, costo, costo_productos, es_tiempo_libre, cobrado, segundos_pausa, fecha_pausa)
VALUES `;
const cantidadRegistros = 10;
for (let x = 0; x < cantidadRegistros; x++) {
const idDispositivo = obtenerNumeroAleatorioEnRango(1, 5);
const inicio = fechaAleatoria();
const fin = new Date(inicio.getTime() + (obtenerNumeroAleatorioEnRango(1, 600) * 60 * 1000));
const inicioFormateado = obtenerCadenaFecha(inicio);
const finFormateado = obtenerCadenaFecha(fin);
const costo = obtenerNumeroAleatorioEnRango(1, 1000);
const costoProductos = obtenerNumeroAleatorioEnRango(1, 1000);
const esTiempoLibre = obtenerNumeroAleatorioEnRango(0, 1);
const cobrado = 1;
const segundosPausa = obtenerNumeroAleatorioEnRango(0, 100);
const fechaPausa = "";
cadena += `
("${idDispositivo}","${inicioFormateado}", "${finFormateado}", ${costo}, ${costoProductos}, ${esTiempoLibre}, ${cobrado}, ${segundosPausa},"${fechaPausa}")`;
if (x + 1 < cantidadRegistros) {
cadena += ",";
} else {
cadena += ";";
}
}
console.log(cadena);
Por aquí te dejo con más tutoriales de JavaScript.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.