Crear una base de datos MySQL localmente para NodeJS en Ubuntu y usando TablePlus

Estoy trabajando en un proyecto local NodeJS con Express y llegué al paso donde tengo que crear una base de datos y configurarla en el proyecto. Voy a trabajar con MySql y TablePlus, un administrador de bases de datos que se ejecuta en la laptop localmente.

Qué es un servidor de base de datos MySQL

Un servidor de base de datos MySQL es un software que se ejecuta en una computadora y se utiliza para almacenar, organizar y recuperar datos en una estructura de base de datos. La información se guarda en archivos en el sistema de archivos del servidor, y se puede acceder y manipular mediante consultas SQL.

Los datos de la base de datos en MySQL se guardan en una ubicación específica en el sistema de archivos. En Ubuntu, la ubicación predeterminada es /var/lib/mysql y cada base de datos que creas tiene su propia carpeta en esa ubicación. Cada carpeta de base de datos contiene los archivos que contienen los datos y las estructuras de las tablas de esa base de datos.

Los archivos que contienen los datos de la tabla en MySQL tienen extensiones como .frm, .MYD y .MYI, y cada uno tiene una función específica. El archivo .frm contiene la estructura de la tabla, mientras que los archivos .MYD y .MYI contienen los datos de la tabla y los índices respectivamente.

Estos archivos no deben ser manipulados directamente, ya que MySQL se encarga de manejarlos. Si necesitas hacer una copia de seguridad de la base de datos o migrarla a otro servidor, lo recomendable es utilizar las herramientas proporcionadas por MySQL, como mysqldump.

Instalación del servidor de base de datos

Instalar el servidor MySql en Ubuntu es muy fácil desde una terminal de linux con los siguientes comandos:

~$ sudo apt update
~$ sudo apt install mysql-server

Para efectos prácticos no muestro las respuestas de estos comandos pero puedes comprobar que todo salió bien con el siguiente:

~$ sudo systemctl status mysql
~$ sudo systemctl status mysql
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-04-12 11:21:08 EDT; 2min 19s ago
    Process: 32825 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
   Main PID: 32857 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 9312)
     Memory: 365.4M
        CPU: 2.981s
     CGroup: /system.slice/mysql.service
             └─32857 /usr/sbin/mysqld

Ya con esto tenemos un servidor MySql instalado localmente en nuestra laptop con Ubuntu.

Crear el usuario de la base de datos

Para crear una base de datos es necesario tener primero el usuario. Para ello preferí continuar usando la terminal. A continuación el bloque de comandos usados y una descripción:

Para iniciar sesión en MySQL:

~$ sudo mysql

Para crear el usuario:

mysql> CREATE USER 'nombre_de_usuario'@'localhost' IDENTIFIED WITH mysql_native_password BY 'contraseña';

Para verificar que el usuario se haya creado correctamente:

mysql> SELECT User FROM mysql.user;

El siguiente comando es para conceder los permisos necesarios para crear bases de datos, aunque más adelante usé otro comando para darle todos los privilegios:

mysql> GRANT CREATE ON *.* TO 'nombre_de_usuario'@'localhost';

El siguiente comando es para verificar los privilegios de un usuario:

mysql> SHOW GRANTS FOR 'nombre_de_usuario'@'localhost';

Ahora sí, ejecuté el siguiente comando para darle todos los privilegios:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'nombre_de_usuario'@'localhost';

Para salir de la sesión de MySQL basta con:

mysql> exit

A continuación se pueden ver las respuestas de estos comandos en la creación del usuario y en los privilegios otorgados:

mysql> CREATE USER 'amelia'@'localhost' IDENTIFIED WITH mysql_native_password BY '12345678';
Query OK, 0 rows affected (0.03 sec)

mysql> SELECT User FROM mysql.user;
+------------------+
| User             |
+------------------+
| amelia          |
| debian-sys-maint |
| mysql.infoschema |
| mysql.session    |
| mysql.sys        |
| root             |
+------------------+
6 rows in set (0.00 sec)

mysql> GRANT CREATE ON *.* TO 'amelia'@'localhost';
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW GRANTS FOR 'amelia'@'localhost';
+----------------------------------------------+
| Grants for amelia@localhost                 |
+----------------------------------------------+
| GRANT CREATE ON *.* TO `amelia`@`localhost` |
+----------------------------------------------+
1 row in set (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'amelia'@'localhost';
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW GRANTS FOR 'amelia'@'localhost';
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for amelia@localhost                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `amelia`@`localhost`                                                                                                                                                                                                                                                                                                                                                                 |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `amelia`@`localhost` |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> exit
Bye

Hay un supuesto comando para aplicar los cambios luego que se le han dado todos los privilegios al usuario pero yo no lo ejecuté, no obstante lo dejo aquí por si acaso:

mysql> FLUSH PRIVILEGES;

Con esto ya tengo un usuario creado en el servidor MySQL, ahora a crear la base de datos con este usuario.

Iniciar sesión con el usuario creado

Inicia sesión en MySQL ejecutando el siguiente comando:

~S mysql -u nombre_de_usuario -p

Obtendras una respuesta como la de abajo:

~$ mysql -u amelia -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.32-0ubuntu0.22.04.2 (Ubuntu)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

Crear la base de datos

Una vez que se inicia sesión se puede ejecutar el siguiente comando para crear una nueva base de datos:

mysql> CREATE DATABASE nombre_de_la_base_de_datos;

Luego puedo tener una lista de las bases de datos creadas con el siguiente comando:

mysql> SHOW DATABSES;
mysql> CREATE DATABASE babiloniaDB;
Query OK, 1 row affected (0.03 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| babiloniaDB        |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql>

Una vez que ya tengo la base de datos, mi premisa es cargarla con información, o datos, para ello es necesario un administrador de base de datos que me funcione localmente como lo es TablePlus.

TablePlus

TablePlus es un software de administración de bases de datos fácil de usar que permite a los usuarios conectarse y trabajar con diferentes tipos de bases de datos, incluyendo MySQL, PostgreSQL, SQLite, Microsoft SQL Server, entre otros.

Con TablePlus, puedes crear, editar y eliminar tablas, registros y vistas, importar y exportar datos, ejecutar consultas SQL, y realizar copias de seguridad y restauración de datos. Además, TablePlus también ofrece funciones avanzadas, como autocompletado de código, realce de sintaxis y refactorización de código. El software está disponible para macOS, Windows y Linux.

Brigzen - Logo de Table Plus con fondo de Ubuntu

Instalación de TablePlus

Para la instalación de TablePlus me remití a la información suministrada por ellos mismos para tal fin.

La instalación de TablePlus en Linux se lleva a cabo por medio de la terminal. Los desarrolladores de esta aplicación tienen diferentes procedimientos de instalación en Linux dependiendo de la distribución, su versión y la arquitectura del sistema. Para en el caso de Ubuntu, hay que seleccionar el procedimiento para administraciones de paquetes tipo «apt».

Tomado para la fecha de 14 de abril de 2023

Luego tienes que seleccionar dentro de los procedimientos con administración de paquetes apt cuál de ellos es el correcto dependiendo de tu versión de Ubuntu y tu arquitectura de sistema. En mi caso mi laptop es una Asus con procesador Intel i7, por lo que su arquitectura es 64 bits x86_64. Y mi versión de Ubuntu se mantiene actualizada por que lo que es 22.04. En caso de que no sepas ambas cosas, debes ejecutar los siguientes comandos en una terminal:

~$ lsb_release -a
~$ uname -m
~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.1 LTS
Release:	22.04
Codename:	jammy
~$ uname -m
x86_64
~$ 

Conociendo lo anterior ejecuta los comandos correctos en la terminal. En mi caso el primero es:

~$ wget -qO - https://deb.tableplus.com/apt.tableplus.com.gpg.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/tableplus-archive.gpg > /dev/null

El comando anterior se utiliza para agregar la clave GPG (GNU Privacy Guard) de TablePlus a tu sistema Linux. GPG es una herramienta de cifrado de datos que se utiliza para garantizar la autenticidad e integridad de los datos en la comunicación en línea. Al agregar la clave GPG de TablePlus a tu sistema, podrás verificar la autenticidad de los paquetes de TablePlus que descargues e instales.

Ahora sí, para agregar los repositorios de TablePlus:

sudo add-apt-repository "deb [arch=amd64] https://deb.tableplus.com/debian/22 tableplus main"

Finalmente la instalación con una previa actualización de los repositorios:

sudo apt update
sudo apt install tableplus

Con esto debes tener instalado TablePlus en Ubuntu. Ahora tenemos que conectar TablePlus con la base de datos que hemos creado anteriormente.

Crear la conexión con la base de datos

Cuando abres TablePlus te vas a encontrar con algo como esto

Ese cuadro es para crear la conexión con la base de datos, los datos necesarios los debes tener al momento de haber creado la base de datos. El puerto por default que usa MySQL es el 3306 que ya lo ves marcado en el campo correspondiente.

En todo caso si quieres corroborarlo, puedes hacerlo usando el siguiente comando:

mysql> SHOW VARIABLES WHERE Variable_name = 'port';
mysql> SHOW VARIABLES WHERE Variable_name = 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.01 sec)

En mi caso cuando llené los datos quedó algo así como esto:

Una vez que tienes los datos completos puedes hacer clic en el botón Test para que el mismo software te indique si hace o no conexión con esos datos. Luego de eso corriges si es necesario o, finalmente, haces clic en el botón Connect.

Luego de ellos ya estás en la ventana de trabajo de la conexión establecida. En la parte de arriba debe aparece el nombre de la conexión.

Introducir datos en la base de datos

Yo necesitaba tener ciertos datos en la base de datos para continuar con las lecciones de un curso sobre esto mismo. Pero ya esto va de meter comandos SQL para crear y editar tablas y sus datos. Y ya eso es un mundo. A continuación te muestro la introducción de unos datos de ejemplo que era lo que yo necesitaba hasta el momento de escribir esto.

Para introducir comandos SQL en TablePlus tienes que abrir una pestaña para ello con el botón correspondiente.

Luego en pestaña SQL QUery que se abre introduces los comandos, en mi caso fue el siguiente:

Con lo anterior se crea la tabla «viajes» dentro de la base de datos con los nombres de columnas que se ven allí. Luego clic en el botón Run Current o Ctrl+Enter.

Te debe aparecer del lado izquierdo la tabla que has recién creado.

En caso que no sea así haz clic en el botón para refrescar la conexión.

Luego con lo siguiente introduje datos en la tabla viajes:

INSERT INTO `viajes` (`id`, `titulo`, `precio`, `fecha_ida`, `fecha_vuelta`, `imagen`, `descripcion`, `disponibles`, `slug`) VALUES(1, 'Italia', '50000', '2021-06-24', '2021-06-30', 'roma', 'Praesent tincidunt ante at justo semper volutpat. Sed risus neque, scelerisque id dictum in, placerat non erat. Sed eget tellus eu mauris faucibus pharetra. Praesent vulputate diam ac diam dignissim, eu semper turpis gravida. Vestibulum tempor purus orci, vitae ullamcorper erat congue quis. Nullam dapibus dui a velit lacinia, eu cursus massa cursus. Morbi lobortis fermentum urna, quis tincidunt justo varius vitae. In justo nisl, auctor vel eros sed, tempus efficitur lacus. Maecenas volutpat pharetra dolor, nec rutrum ipsum dapibus id.\r\n\r\nMauris ultricies augue lectus, efficitur tincidunt enim euismod non. Praesent nisl elit, eleifend et eleifend eu, venenatis et felis. Donec eleifend mi in congue semper. Quisque hendrerit purus eget pharetra laoreet. Donec nisl nisi, auctor at vehicula et, fermentum sed urna. In nec porta felis, eu ullamcorper lacus. Curabitur scelerisque commodo laoreet. Donec finibus vel nibh quis ultrices. Integer varius tellus sed leo tempor, vitae ullamcorper leo placerat.', 32, 'viaje-italia'),(2, 'Canada', '60000', '2021-07-19', '2021-07-19', 'canada', 'Praesent tincidunt ante at justo semper volutpat. Sed risus neque, scelerisque id dictum in, placerat non erat. Sed eget tellus eu mauris faucibus pharetra. Praesent vulputate diam ac diam dignissim, eu semper turpis gravida. Vestibulum tempor purus orci, vitae ullamcorper erat congue quis. Nullam dapibus dui a velit lacinia, eu cursus massa cursus. Morbi lobortis fermentum urna, quis tincidunt justo varius vitae. In justo nisl, auctor vel eros sed, tempus efficitur lacus. Maecenas volutpat pharetra dolor, nec rutrum ipsum dapibus id.\r\n\r\nMauris ultricies augue lectus, efficitur tincidunt enim euismod non. Praesent nisl elit, eleifend et eleifend eu, venenatis et felis. Donec eleifend mi in congue semper. Quisque hendrerit purus eget pharetra laoreet. Donec nisl nisi, auctor at vehicula et, fermentum sed urna. In nec porta felis, eu ullamcorper lacus. Curabitur scelerisque commodo laoreet. Donec finibus vel nibh quis ultrices. Integer varius tellus sed leo tempor, vitae ullamcorper leo placerat.', 25, 'viaje-canada'),(3, 'Grecia', '40000', '2021-08-29', '2021-09-15', 'grecia', 'Praesent tincidunt ante at justo semper volutpat. Sed risus neque, scelerisque id dictum in, placerat non erat. Sed eget tellus eu mauris faucibus pharetra. Praesent vulputate diam ac diam dignissim, eu semper turpis gravida. Vestibulum tempor purus orci, vitae ullamcorper erat congue quis. Nullam dapibus dui a velit lacinia, eu cursus massa cursus. Morbi lobortis fermentum urna, quis tincidunt justo varius vitae. In justo nisl, auctor vel eros sed, tempus efficitur lacus. Maecenas volutpat pharetra dolor, nec rutrum ipsum dapibus id.\r\n\r\nMauris ultricies augue lectus, efficitur tincidunt enim euismod non. Praesent nisl elit, eleifend et eleifend eu, venenatis et felis. Donec eleifend mi in congue semper. Quisque hendrerit purus eget pharetra laoreet. Donec nisl nisi, auctor at vehicula et, fermentum sed urna. In nec porta felis, eu ullamcorper lacus. Curabitur scelerisque commodo laoreet. Donec finibus vel nibh quis ultrices. Integer varius tellus sed leo tempor, vitae ullamcorper leo placerat.', 18, 'viaje-grecia'),(4, 'Inglaterra', '8000', '2021-09-22', '2021-10-03', 'londres', 'Praesent tincidunt ante at justo semper volutpat. Sed risus neque, scelerisque id dictum in, placerat non erat. Sed eget tellus eu mauris faucibus pharetra. Praesent vulputate diam ac diam dignissim, eu semper turpis gravida. Vestibulum tempor purus orci, vitae ullamcorper erat congue quis. Nullam dapibus dui a velit lacinia, eu cursus massa cursus. Morbi lobortis fermentum urna, quis tincidunt justo varius vitae. In justo nisl, auctor vel eros sed, tempus efficitur lacus. Maecenas volutpat pharetra dolor, nec rutrum ipsum dapibus id.\r\n\r\nMauris ultricies augue lectus, efficitur tincidunt enim euismod non. Praesent nisl elit, eleifend et eleifend eu, venenatis et felis. Donec eleifend mi in congue semper. Quisque hendrerit purus eget pharetra laoreet. Donec nisl nisi, auctor at vehicula et, fermentum sed urna. In nec porta felis, eu ullamcorper lacus. Curabitur scelerisque commodo laoreet. Donec finibus vel nibh quis ultrices. Integer varius tellus sed leo tempor, vitae ullamcorper leo placerat.', 22, 'viaje-inglaterra'),(5, 'Rio de Janeiro', '50000', '2021-04-16', '2021-04-25', 'rio', 'Praesent tincidunt ante at justo semper volutpat. Sed risus neque, scelerisque id dictum in, placerat non erat. Sed eget tellus eu mauris faucibus pharetra. Praesent vulputate diam ac diam dignissim, eu semper turpis gravida. Vestibulum tempor purus orci, vitae ullamcorper erat congue quis. Nullam dapibus dui a velit lacinia, eu cursus massa cursus. Morbi lobortis fermentum urna, quis tincidunt justo varius vitae. In justo nisl, auctor vel eros sed, tempus efficitur lacus. Maecenas volutpat pharetra dolor, nec rutrum ipsum dapibus id.\r\n\r\nMauris ultricies augue lectus, efficitur tincidunt enim euismod non. Praesent nisl elit, eleifend et eleifend eu, venenatis et felis. Donec eleifend mi in congue semper. Quisque hendrerit purus eget pharetra laoreet. Donec nisl nisi, auctor at vehicula et, fermentum sed urna. In nec porta felis, eu ullamcorper lacus. Curabitur scelerisque commodo laoreet. Donec finibus vel nibh quis ultrices. Integer varius tellus sed leo tempor, vitae ullamcorper leo placerat.', 23, 'viaje-rio-de-janeiro'),(6, 'Francia', '75000', '2021-04-03', '2021-04-10', 'paris', 'Praesent tincidunt ante at justo semper volutpat. Sed risus neque, scelerisque id dictum in, placerat non erat. Sed eget tellus eu mauris faucibus pharetra. Praesent vulputate diam ac diam dignissim, eu semper turpis gravida. Vestibulum tempor purus orci, vitae ullamcorper erat congue quis. Nullam dapibus dui a velit lacinia, eu cursus massa cursus. Morbi lobortis fermentum urna, quis tincidunt justo varius vitae. In justo nisl, auctor vel eros sed, tempus efficitur lacus. Maecenas volutpat pharetra dolor, nec rutrum ipsum dapibus id.\r\n\r\nMauris ultricies augue lectus, efficitur tincidunt enim euismod non. Praesent nisl elit, eleifend et eleifend eu, venenatis et felis. Donec eleifend mi in congue semper. Quisque hendrerit purus eget pharetra laoreet. Donec nisl nisi, auctor at vehicula et, fermentum sed urna. In nec porta felis, eu ullamcorper lacus. Curabitur scelerisque commodo laoreet. Donec finibus vel nibh quis ultrices. Integer varius tellus sed leo tempor, vitae ullamcorper leo placerat.', 14, 'viaje-francia');

Al finalizar te debe quedar la tabla con los datos anteriores, algo así como lo siguiente:

Ya con esto tienes una base de datos creada y con datos en ella, aunque solo una tabla.

Instalar dependencias

Ahora hay que instalar algunas dependencias en Express para que el desarrollo pueda interactuar con la base de datos.

Deja un comentario