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

# Fecha 10/09/2024
# Programa: crea una base de datos MySQL por medio de un código escrito en Bash.

# Expresiones regulares para establecer el formato del input
db_regex='^[a-zA-Z0-9_]+$'
tabla_regex='^[a-zA-Z0-9_]+$'
columna_regex='^[a-zA-Z0-9_ ]+$'

conseguir_nombre_database() {
  while true; do
    read -p "Ingrese el nombre de la base de datos: " nombre_nueva_database
    
    if [[ $nombre_nueva_database =~ $db_regex ]]; then
      if mysql -u root -p -s -N -e "SHOW DATABASES" | grep -Fxq "$nombre_nueva_database"; then
        echo "La base de datos $nombre_nueva_database ya existe. No se continuará con esta función."
      else
        break
      fi
    else
      echo "El nombre solo puede contener letras, números o guiones bajos."
    fi
  done
  
  echo "$nombre_nueva_database"
}

conseguir_nombre_tabla() {
  while true; do
    read -p "Ingrese el nombre para la tabla: " nombre_tabla
    if [[ $nombre_tabla =~ $tabla_regex ]]; then
      break
    else
      echo "El nombre solamente puede tener letras, números y guiones bajos."
    fi
  done
  echo "$nombre_tabla"
}

conseguir_num_columnas() {
  while true; do
    read -p "Establezca la cantidad de columnas: " numero_columnas
    if [[ $numero_columnas =~ ^[1-9][0-9]*$ ]]; then
      break
    else
      echo "El número de columnas solamente puede ser un entero positivo."
    fi
  done
  echo "$numero_columnas"
}

conseguir_info_columnas() {
  local numero_columnas="$1"
  local columns=""
  for (( i=1; i<=$numero_columnas; i++ )); do
    while true; do
      read -p "Ingrese el nombre de la columna N° $i: " nombre_columna
      if [[ $nombre_columna =~ $columna_regex ]]; then
        nombre_columna=$(echo "$nombre_columna" | tr ' ' '_')
        break
      else
        echo "El nombre de la columna solo puede tener letras, números y guiones bajos."
      fi
    done
    while true; do
      read -p "Ingrese el tipo de la columna N° $i (TEXT, INT, DATE, FLOAT): " tipo_columna
      if [[ "$tipo_columna" =~ ^(INT|TEXT|DATE|FLOAT)$ ]]; then
        break
      else
        echo "El tipo de la columna solamente puede ser INT, FLOAT, TEXT, o DATE."
      fi
    done
    if [ $i -eq $numero_columnas ]; then
      columns+="$nombre_columna $tipo_columna"
    else
      columns+="$nombre_columna $tipo_columna,"
    fi
  done
  echo "$columns"
}

create_database() {
  local nombre_nueva_database="$1"
  local nombre_tabla="$2"
  local columns="$3"
  
  # Create the database
  mysql -u root -p -v -e "CREATE DATABASE IF NOT EXISTS \`$nombre_nueva_database\`;"
  if [ $? -ne 0 ]; then
    echo "Ocurrió un error al momento de crear la base de datos."
    exit 1
  fi
  
  # Create the table
  mysql -u root -p -v -e "CREATE TABLE IF NOT EXISTS \`$nombre_nueva_database\`.\`$nombre_tabla\` ($columns) ENGINE=InnoDB;"
  if [ $? -ne 0 ]; then
    echo "Ocurrió un error al momento de crear la tabla."
    exit 1
  fi
}

# Main execution
nombre_nueva_database=$(conseguir_nombre_database)
if [ $? -ne 0 ]; then
  echo "No se pudo crear la base de datos. Saliendo."
  exit 1
fi

nombre_tabla=$(conseguir_nombre_tabla)
numero_columnas=$(conseguir_num_columnas)
columns=$(conseguir_info_columnas "$numero_columnas")


echo "Comando MySQL: CREATE DATABASE IF NOT EXISTS \`$nombre_nueva_database\`; CREATE TABLE IF NOT EXISTS \`$nombre_nueva_database\`.\`$nombre_tabla\` ($columns) ENGINE=InnoDB;"

create_database "$nombre_nueva_database" "$nombre_tabla" "$columns"

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

¿Cómo funciona?

Para empezar, el programa establece algunas expresiones regulares para marcar 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.

Hay que notar que el programa utiliza:

mysql -u root -p

Como opciones para generar la base de datos y todo lo que sigue. Pero podemos cambiar “root” por el nombre de nuestra propia cuenta para usar otro nivel de administración.

¿Qué se puede mejorar?

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

Si tengo que decir dos cosas:

  1. Agregar la opción para generar múltiples tablas en lugar de una sola.
  2. Mejorar la forma en que se resuelven los errores.

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

– Documentación de MySQL. (en inglés)

Leave a Reply