|
| 1 | +--- |
| 2 | +title: 'Cómo usar una base de datos MySQL con Node.js: Guía Completa' |
| 3 | +date: '2025-01-30' |
| 4 | +tags: ['sql', 'mysql'] |
| 5 | +draft: false |
| 6 | +summary: 'Aprende cómo integrar una base de datos MySQL en tu aplicación Node.js paso a paso. Descubre las mejores prácticas, optimización y ejemplos prácticos para gestionar datos eficientemente.' |
| 7 | +authors: ['default'] |
| 8 | +--- |
| 9 | + |
| 10 | +Si estás buscando una forma de integrar una base de datos MySQL en tu aplicación Node.js, estás en el lugar correcto. En este artículo, te mostraremos paso a paso cómo hacerlo de manera efectiva, desde la instalación hasta las consultas SQL más comunes. ¡Vamos a empezar! |
| 11 | +## ¿Por qué elegir MySQL con Node.js? |
| 12 | + |
| 13 | +MySQL es uno de los sistemas de gestión de bases de datos más populares debido a su fiabilidad, escalabilidad y facilidad de uso. Cuando lo combinas con Node.js, un entorno de ejecución rápido y eficiente, obtienes una solución potente para aplicaciones web y móviles. Veamos por qué es una excelente elección: |
| 14 | + |
| 15 | +- **Rendimiento rápido**: Node.js maneja múltiples conexiones simultáneas eficientemente. |
| 16 | +- **Ampliamente soportado**: La comunidad de desarrolladores de Node.js y MySQL es enorme. |
| 17 | +- **Escalabilidad**: Ideal para aplicaciones que requieren crecimiento en el tiempo. |
| 18 | + |
| 19 | +## Requisitos previos |
| 20 | + |
| 21 | +Antes de comenzar, asegúrate de tener instalados los siguientes elementos: |
| 22 | + |
| 23 | +- **Node.js**: Si aún no lo tienes, puedes descargarlo desde [su página oficial](https://nodejs.org). |
| 24 | +- **MySQL**: Instala MySQL desde [aquí](https://dev.mysql.com/downloads/). |
| 25 | +- **Docker** (opcional): Si prefieres usar un contenedor de Docker para MySQL, puedes hacerlo. [Aquí](https://hub.docker.com/_/mysql) tienes más información. |
| 26 | +- **Administrador de paquetes NPM**: Node.js incluye npm, lo que facilita la instalación de dependencias. |
| 27 | +- **Table Plus** (opcional) o cualquier otro cliente de MySQL para visualizar y administrar la base de datos. |
| 28 | +## Iniciar proyecto en Nodejs |
| 29 | +primero debemos crear nuestra carpeta y iniciar el siguiente comando |
| 30 | +```bash |
| 31 | +npm init -y |
| 32 | +``` |
| 33 | +ahora crearemos nuestra estructura de carpetas |
| 34 | + |
| 35 | +en este caso index.js para nuestro archivo principal |
| 36 | +y docker compose para la configuracion de nuestra base de datos en docker si no queremos instalar mysql en nuestra maquina recuerda que debes tener instalado docker DeskTop en tu PC |
| 37 | +[instlar docker](https://docs.docker.com/desktop/setup/install/windows-install/) |
| 38 | + |
| 39 | +## Iniciar Mysql con Docker |
| 40 | +en el archivo docker-compose.yml debemos tener el siguiente codigo |
| 41 | +```yml |
| 42 | +version: '3.8' |
| 43 | + |
| 44 | +services: |
| 45 | + mysql: |
| 46 | + image: mysql:latest |
| 47 | + container_name: mysql-container |
| 48 | + environment: |
| 49 | + MYSQL_ROOT_PASSWORD: rootpassword |
| 50 | + MYSQL_DATABASE: my_database |
| 51 | + MYSQL_USER: user |
| 52 | + MYSQL_PASSWORD: userpassword |
| 53 | + ports: |
| 54 | + - "3306:3306" |
| 55 | + volumes: |
| 56 | + - mysql-data:/var/lib/mysql |
| 57 | + networks: |
| 58 | + - mysql_network |
| 59 | + |
| 60 | +volumes: |
| 61 | + mysql-data: |
| 62 | + |
| 63 | +networks: |
| 64 | + mysql_network: |
| 65 | + driver: bridge |
| 66 | +``` |
| 67 | +con este codigo definiremos el usuario y contraseña de nuestra base de datos y el nombre de la base de datos que vamos a usar en este caso my_database y el puerto que vamos a usar en este caso 3306 |
| 68 | +par que funcione debemos tener abierto nuestro DockerDestop y ejecutar el siguiente comando en la terminal |
| 69 | +```bash |
| 70 | +docker-compose up -d |
| 71 | +``` |
| 72 | +una vez que lo corras de deberia descargar la imagen en docker y iniciar el contenedor de mysql y ya tendriamos nuestra base de datos corriendo en nuestro localhost:3306 |
| 73 | + |
| 74 | +aca podras ver tu contenedor corriendo en docker y en caso de error podras ver el log de tu contenedor el error mas comun que me pasa es tener instlado mysql en mi pc con el puerto por defecto 3306 y no poder usarlo en docker para solucionar esto debes detener el servicio de mysql en tu pc y volver a correr el docker-compose up -d |
| 75 | + |
| 76 | +## Comprobar la base de datos (opcional) |
| 77 | +para comprobar que la base de datos este corriendo perfectamente vamos a usar Table Plus o cualquier otro cliente de MySQL para conectarnos a nuestra base de datos. |
| 78 | +primero debemos crear una nueva conexion en Table Plus |
| 79 | +y usaremos los datos que definimos en el docker-compose.yml para conectarnos a nuestra base de datos |
| 80 | + |
| 81 | +una vez que inicies podras ver tu base de datos corriendo perfectamente |
| 82 | + |
| 83 | +aca podemos administrar nuestra base de datos y tablas desde una interfaz grafica |
| 84 | + |
| 85 | +### ahora si a conectar mysql con nodejs |
| 86 | + |
| 87 | +### Instalación de MySQL y el paquete `mysql2` |
| 88 | + |
| 89 | +En primer lugar, debes instalar el paquete que te permitirá interactuar con MySQL desde Node.js. El paquete recomendado es `mysql2`, que es una versión mejorada del paquete `mysql` original. |
| 90 | + |
| 91 | +```bash |
| 92 | +npm install mysql2 |
| 93 | +``` |
| 94 | + |
| 95 | +### Conexión a la base de datos |
| 96 | + |
| 97 | +Una vez instalada la dependencia, es hora de conectar tu aplicación Node.js a MySQL. Aquí te mostramos cómo hacerlo: |
| 98 | +en el archivo index.js debemos tener el siguiente codigo |
| 99 | +```js |
| 100 | +const mysql = require('mysql2'); |
| 101 | + |
| 102 | +// Crear una conexión a la base de datos |
| 103 | +const connection = mysql.createConnection({ |
| 104 | + host: 'localhost', |
| 105 | + user: 'user', |
| 106 | + password: 'userpassword', |
| 107 | + database: 'my_database' |
| 108 | +}); |
| 109 | + |
| 110 | +// Conectar a la base de datos |
| 111 | +connection.connect((err) => { |
| 112 | + if (err) { |
| 113 | + console.error('Error al conectar a la base de datos: ' + err.stack); |
| 114 | + return; |
| 115 | + } |
| 116 | + console.log('Conexión exitosa a la base de datos con el ID: ' + connection.threadId); |
| 117 | +}); |
| 118 | +``` |
| 119 | + |
| 120 | +## Iniciar el servidor de Node.js Con nodemon |
| 121 | +para este paso iniciaremos el servidor usando nodemon para que cada vez que hagamos un cambio en nuestro codigo se reinicie el servidor automaticamente |
| 122 | +para instalar nodemon debemos ejecutar el siguiente comando en la terminal |
| 123 | +```bash |
| 124 | +npm install nodemon -d |
| 125 | +``` |
| 126 | +iniciar nuestro servidor con el siguiente comando |
| 127 | +```bash |
| 128 | +npx nodemon src/index.js |
| 129 | +``` |
| 130 | +una vez que tengas ya todo corriendo podras ver en la terminal que se conecto a la base de datos y podras ver el id de la conexion |
| 131 | + |
| 132 | + |
| 133 | + |
| 134 | +## Operaciones básicas con MySQL |
| 135 | +Ahora que tienes la conexión establecida, puedes comenzar a realizar operaciones sobre tu base de datos. Empecemos con una de las operaciones más comunes: insertar datos. |
| 136 | + |
| 137 | +### crear tabla en la base de datos |
| 138 | +para crear una tabla en la base de datos debemos tener el siguiente codigo en nuestro index.js |
| 139 | +```js |
| 140 | +const sql = ` |
| 141 | +CREATE TABLE IF NOT EXISTS usuarios ( |
| 142 | + id INT AUTO_INCREMENT PRIMARY KEY, |
| 143 | + nombre VARCHAR(255) NOT NULL, |
| 144 | + email VARCHAR(255) NOT NULL |
| 145 | +) |
| 146 | +` |
| 147 | +connection.query(sql, (err, result) => { |
| 148 | + if (err) { |
| 149 | + console.error('Error al crear la tabla: ' + err); |
| 150 | + return; |
| 151 | + } |
| 152 | + console.log('Tabla creada correctamente: ', result); |
| 153 | +}); |
| 154 | + |
| 155 | +``` |
| 156 | +### Insertar datos en la base de datos |
| 157 | + |
| 158 | + |
| 159 | +```js |
| 160 | +const sql = "INSERT INTO usuarios (nombre, email) VALUES (?, ?)"; |
| 161 | +connection.execute(sql, ['Juan Pérez', 'juan@example.com'], (err, result) => { |
| 162 | + if (err) { |
| 163 | + console.error('Error al insertar datos: ' + err); |
| 164 | + return; |
| 165 | + } |
| 166 | + console.log('Datos insertados correctamente: ', result); |
| 167 | +}); |
| 168 | +``` |
| 169 | + |
| 170 | +### Consultar datos |
| 171 | + |
| 172 | +Una vez que tengas datos en la base de datos, puedes realizar consultas para obtenerlos. Aquí te mostramos cómo hacer una consulta simple: |
| 173 | + |
| 174 | +```js |
| 175 | +const sql = "SELECT * FROM usuarios"; |
| 176 | +connection.execute(sql, (err, results) => { |
| 177 | + if (err) { |
| 178 | + console.error('Error al consultar datos: ' + err); |
| 179 | + return; |
| 180 | + } |
| 181 | + console.log('Resultados de la consulta: ', results); |
| 182 | +}); |
| 183 | +``` |
| 184 | + |
| 185 | +### Actualizar datos |
| 186 | + |
| 187 | +También puedes actualizar registros en la base de datos usando una consulta SQL: |
| 188 | + |
| 189 | +```js |
| 190 | +const sql = "UPDATE usuarios SET email = ? WHERE nombre = ?"; |
| 191 | +connection.execute(sql, ['nuevoemail@example.com', 'Juan Pérez'], (err, result) => { |
| 192 | + if (err) { |
| 193 | + console.error('Error al actualizar datos: ' + err); |
| 194 | + return; |
| 195 | + } |
| 196 | + console.log('Datos actualizados correctamente: ', result); |
| 197 | +}); |
| 198 | +``` |
| 199 | + |
| 200 | +### Eliminar datos |
| 201 | + |
| 202 | +Finalmente, también puedes eliminar registros de la base de datos: |
| 203 | + |
| 204 | +```js |
| 205 | +const sql = "DELETE FROM usuarios WHERE nombre = ?"; |
| 206 | +connection.execute(sql, ['Juan Pérez'], (err, result) => { |
| 207 | + if (err) { |
| 208 | + console.error('Error al eliminar datos: ' + err); |
| 209 | + return; |
| 210 | + } |
| 211 | + console.log('Datos eliminados correctamente: ', result); |
| 212 | +}); |
| 213 | +``` |
| 214 | + |
| 215 | +## Manejo de errores y buenas prácticas |
| 216 | + |
| 217 | +Es importante gestionar los errores adecuadamente para evitar que tu aplicación se caiga o quede con datos corruptos. Algunas buenas prácticas incluyen: |
| 218 | + |
| 219 | +- Validar los datos antes de realizar consultas. |
| 220 | +- Usar transacciones para operaciones críticas. |
| 221 | +- Configurar un manejo adecuado de errores para la conexión a la base de datos. |
| 222 | + |
| 223 | +## Optimización de consultas en MySQL |
| 224 | + |
| 225 | +Para mejorar el rendimiento, es importante que tus consultas SQL estén bien optimizadas. Algunas estrategias incluyen: |
| 226 | + |
| 227 | +- **Uso de índices**: Mejora el tiempo de respuesta en las consultas de búsqueda. |
| 228 | +- **Estructura de la base de datos**: Asegúrate de que las tablas estén bien normalizadas. |
| 229 | +- **Evita consultas innecesarias**: Minimiza la cantidad de consultas a la base de datos. |
| 230 | + |
| 231 | +## Conclusión |
| 232 | + |
| 233 | +Integrar MySQL con Node.js es una excelente opción para construir aplicaciones robustas y escalables. Siguiendo estos pasos, podrás crear y administrar tu base de datos con facilidad. Recuerda que las buenas prácticas y la optimización son clave para mantener tu aplicación eficiente. |
| 234 | + |
| 235 | +--- |
| 236 | + |
| 237 | +## Preguntas Frecuentes |
| 238 | + |
| 239 | +### ¿Cuál es la diferencia entre `mysql` y `mysql2`? |
| 240 | + |
| 241 | +`mysql2` es una versión más eficiente y moderna del paquete `mysql`, que también es compatible con promesas y async/await, lo que facilita su uso en aplicaciones Node.js modernas. |
| 242 | + |
| 243 | +### ¿Cómo puedo usar `async/await` con MySQL? |
| 244 | + |
| 245 | +Aquí tienes un ejemplo de cómo usar `async/await` para realizar una consulta: |
| 246 | + |
| 247 | +```js |
| 248 | +const mysql = require('mysql2/promise'); |
| 249 | + |
| 250 | +async function consultarDatos() { |
| 251 | + const connection = await mysql.createConnection({host: 'localhost', user: 'root', database: 'test'}); |
| 252 | + const [rows, fields] = await connection.execute('SELECT * FROM usuarios'); |
| 253 | + console.log(rows); |
| 254 | +} |
| 255 | + |
| 256 | +consultarDatos(); |
| 257 | +``` |
| 258 | + |
| 259 | +--- |
| 260 | + |
| 261 | +## Recursos adicionales |
| 262 | + |
| 263 | +- [Documentación oficial de MySQL](https://dev.mysql.com/doc/) |
| 264 | +- [Documentación de Node.js](https://nodejs.org/es/docs/) |
| 265 | +- [Tutoriales sobre MySQL y Node.js en YouTube](https://www.youtube.com/results?search_query=mysql+nodejs) |
| 266 | + |
| 267 | +[repositorio](https://github.com/Porx312/MysqlNode/tree/mysqlConnectWithDocker) |
0 commit comments