Apuntes mientras aprendo sobre software y computadoras.

programación

Cómo crear una base de datos automáticamente en MySQL con Bash

En este apunte práctico voy a revisar cómo crear una base de datos automáticamente en MySQL con Bash.

Para esto voy a compartirles un pequeño programa que hice para este efecto.

¿Cuál es la idea?

La idea es crear un programa que pueda ayudar a crear una base de datos de forma rápida. Esto incluye: el nombre de la base, el nombre de la tabla, además de los nombres y el tipo de las columnas.

Este código no nos pide que ingresemos datos en la tabla, eso va a quedar para otro proyecto. Hoy solamente busco facilitar los primeros pasos al armar un posible proyecto en MySQL.

Primero necesito tener instalado MySQL y hay varias formas de hacer esto. Pero voy a mencionar la que utilice yo, esto fue con el comando:

sudo apt install mysql-server

Con eso ya es posible empezar a trabajar con las utilidades de MySQL, y esto incluye la capacidad de crear bases de datos desde la terminal. Justo lo que estoy necesitando.

El código

Les comparto el código del programa completo. Al final voy a agregar una pequeña explicacion de lo que hace.

#!/bin/bash

# expresiones regulares para establecer el formato del input que se puede agregar
dbname_regex='^[a-zA-Z0-9_]+$'
tablename_regex='^[a-zA-Z0-9_]+$'
colname_regex='^[a-zA-Z0-9_ ]+$'

while true; do
  read -p "Ingresar el nombre de la base de datos: " db_name
  if [[ $db_name =~ $dbname_regex ]]; then
    if mysql -u root -p -e "SHOW DATABASES" | grep -q "^$db_name$"; then
      read -p "La base de datos $db_name ya existe. ¿Seguir adelante? (s/n)? " choice
      case "$choice" in
        s|S ) echo "Continuar..."; break;;
        n|N ) echo "Salir..."; exit;;
        * ) echo "sole se admite s or n por respuesta.";;
      esac
    else
      echo "La base de datos $db_name todavía no existe."
      break
    fi
  else
    echo "El nombre solo puede contener lietras, números o guiones bajos."
  fi
done

# input para el nombre de la tabla
while true; do
    read -p "Ingresar nombre para la tabla: " table_name
    if [[ $table_name =~ $tablename_regex ]]; then
        break
    else
        echo "El nombre solamente pude tener letras, números y guiones bajos."
    fi
done

# Input para el número de columnas:
while true; do
    read -p "Establecer la cantidad de columnas: " num_cols
    if [[ $num_cols =~ ^[0-9]+$ ]]; then
        break
    else
        echo "El número de columnas solamente puede ser un entero positivo."
    fi
done


# prompt user for column names and types
columns=""
for (( i=1; i<=$num_cols; i++ )); do
  while true; do
    read -r -p "Ingresá el nombre de la columna N° $i: " col_name
    if [[ $col_name =~ $colname_regex ]]; then
      col_name=$(echo "$col_name" | tr ' ' '_' | xargs)
      break
    else
      echo "El nombre de la columna solo puede tener letras, números y guiones bajos."
    fi
  done
     while true; do
    read -r -p "Ingresá el tipo de la columna N° $i (TEXT, INT, etc.): " col_type
    if [[ "$col_type" =~ ^(INT|TEXT|DATE|FLOAT)$ ]]; then
        break
    else
        echo "El tipo de la columna solamente puede ser INT, FLOAT,  TEXT, or DATE."
    fi
    done
    if [ $i -eq $num_cols ]; then
        columns+=" $col_name $col_type"
    else
        columns+=" $col_name $col_type,"
    fi
done

echo "Columns: $columns"

echo "MySQL Command: CREATE TABLE IF NOT EXISTS \`$table_name\` ($columns) ENGINE=InnoDB;"

# MySQL database and table with specified columns and types
mysql -u root -p -v -e "CREATE DATABASE IF NOT EXISTS \`$db_name\`; USE \`$db_name\`; CREATE TABLE IF NOT EXISTS \`$table_name\` ($columns) ENGINE=InnoDB;"

# Revisa si ocurre algún error al momento de crear la base de datos
if [ $? -ne 0 ]; then
    echo "Ocurrió un error al momento de crear la base de datos"
    exit 1
fi

echo "La base de datos fue creada con éxito."

¿Cómo funciona?

Para empezar, el programa establece algunas expresiones regulares para establecer las reglas en los nombres que vamos a poder utilizar.

Luego, de forma secuencial, el programa pide el nombre de la base de datos, el nombre de la tabla y el número de columnas.

En base al número de columnas, el código nos pide el nombre y el tipo de las columnas. Para mantener todo lo más simple posible, solamente se admiten cuatro tipos de datos en la futura tabla.

Finalmente el programa usa el comando mysql para generar la base de datos y nos avisa si pudo completar el trabajo con éxito.

¿Qué se puede mejorar?

Seguramente hay muchas cosas que se pueden mejorar en el programa.

Si tengo que decir una sola, creo que lo más importante es mejorar la forma en que se resuelven los errores.

En la forma que se encuentra escrito actualmente, lo que se hace es revisar entre las bases de datos ya existentes y luego en base a eso se elije si continuar o no. Para hacer esto es necesario ingresar la contraseña de MySQL, y puede ser un poco aburrido.

Tal vez hay una mejor forma de declarar los errores. O se puede utilizar una herramienta del sistema para revisar los nombres de los archivos en el directorio elegido y evitar de ese modo un ingreso de nombre repetido. Al no hacerlo con MySQL sería posible evitar pedir la contraseña para eso.

No me puse a hacer esas mejoras para empezar a hacer otros proyectos, pero tal vez en algún momento vuelva a revisarlo.

Conclusión

Espero que este programa te resulte de utilidad.

Por favor, avisame si encontrás algún error así voy a poder corregirlo.

La seguimos en el próximo apunte.

Recursos

– Manual de MySQL. (en inglés)

Leave a Reply