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

Servidor HTTP en Android con Flutter

El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…

4 días hace

Imprimir automáticamente todos los PDF de una carpeta

En este post te voy a enseñar a designar una carpeta para imprimir todos los…

5 días hace

Guía para imprimir en plugin versión 1 desde Android

En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…

1 semana hace

Añadir tasa de cambio en sistema de información

Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…

2 semanas hace

Comprobar validez de licencia de plugin ESC POS

Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…

2 semanas hace

Imprimir euro € en impresora térmica

Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…

4 semanas hace

Esta web usa cookies.