bases de datos

Generador de datos SQL con JavaScript

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.

Detalle de la tabla

El script que hice solo llenaba una tabla de la base de datos, misma que tiene las siguientes columnas:

  • id_dispositivo
  • inicio
  • fin
  • costo
  • costo_productos
  • es_tiempo_libre
  • cobrado
  • segundos_pausa
  • fecha_pausa

Como puedes ver tiene algunas columnas que son de fechas.

Funciones

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.

Generando datos aleatorios para llenar base de datos

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:

Generar datos aleatorios con JavaScript para llenar base de datos SQL

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.

Importando datos aleatorios en base de datos

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.

Miles de datos generados en formato SQL con Script de JavaScript para llenar base de datos

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.