Skip to content

5 MySQL

Introducción

Otra de las formas de gestionar nuestros datos en nuestra API, es a través de una base de datos relacional con SQL. Para ello podemos usar MySQL como gestor y la librería mysql2 para tratar con ello.

Dicho paquete por defecto usa callbacks para resolver la asincronía, pero tiene una versión del paquete con el que trabaja con promesas: mysql2/promises

Conexión

Para realizar la conexión de MySQL necesitamos cierta información:

  • host: host del servidor SQL.
  • port: puerto del servidor SQL.
  • user: nombre de usuario.
  • password: contraseña del usuario.
  • database: nombre la base de datos.

Esta información puede ir toda unida en una URL de acceso a MySQL o por el contrario podemos tratarla como una objeto. Luego, dicha configuración será utilizada como parámetro en el método createConnection que se utiliza para poder crear la conexión.

const DEFAULT_CONFIG = {
    host: 'localhost',
    user: 'root',
    port: 3306,
    password: '',
    database: 'moviesdb'
}

const config = process.env.DATABASE_URL ?? DEFAULT_CONFIG

const connection = await mysql.createConnection(config)

Queries

Una vez creada la conexión, se puede usar el método query(sql) para realizar consultas a la base de datos. Este método recibe una cadena con la consulta ejecutar y devuelve un array de dos dimensiones, donde la primera dimensión corresponde a los resultados obtenidos de la consulta, y la segunda a la información de las columnas devueltas.

const sql = 'SELECT HEX(id) id, title, year, director, duration, poster, rate FROM movie'

const [movies] = await connection.query(sql)

return movies

Además se pueden realizar consultas parametrizadas, es decir, donde se indique un valor después de la consulta. El mismo método puede recibir un array con los valores de los parámetros. De esta forma, el primer valor del array corresponde al primer parámetro de la consulta. Un parámetro de la consulta se indica con el signo de interrogación ?:

const sql = `select HEX(m.id) id, title, year, director, duration, poster, rate 
        from movie m 
        join movie_genres mg 
            on mg.movie_id = m.id 
        join genre g 
            on mg.genre_id = g.id 
        where g.name = ?`

const [movies] = await connection.query(sql, genre)

return movies

¡Cuidado!

NO se recomienda hacer uso de una inyección manual de los parámetros, ya que es un error grave de seguridad. Si dependemos de que el usuario nos facilite el valor del parámetro no es recomendado porque no podemos asegurar lo que nos va a pasar y se pueda evaluar antes de la ejecución de la consulta. De esta forma, pase lo que pase el usuario, será convertido a una cadena, por lo que no se valuará antes de la consulta.

Cuando realizamos una consulta de cambio en los datos de la tabla (crear, actualizar o eliminar), el método query retorna la información sobre dicha consulta, incluyendo el id que se haya insertado, pero únicamente si éste es auto-incrementable. Si tenemos otro forma de crear una id automática en la base de datos, no hay forma de recuperarla, por lo que se recomienda gestionar estas claves en el servidor de la API:

const [uuidResult] = await connection.query('SELECT UUID() uuid') //(1)!
const [{ uuid }] = uuidResult

await connection.query(`INSERT INTO movie (id, title, year, director, duration, poster, rate)
VALUES (hex(?), ?, ?, ?, ?, ?, ?)`,
    [uuid, title, year, director, duration, poster, rate]
) //(2)!

const [movies] = await connection.query(
    `SELECT HEX(id) id, title, year, director, duration, poster, rate
    FROM movie WHERE id = hex(?)`,
    [uuid]
) // (3)!

return movies[0]
  1. Realizamos una consulta en la base de datos que me devuelva un id creado automáticamente a través de la función UUID de MySQL.
  2. Insertamos la película con la id obtenida.
  3. Buscamos la película que tenga dicha id.

ORMs

Una ORM es un modelo de programación que permite mapear las estructuras de una base de datos relacional. Esto es una buena práctica para las empresas cuyo proyectos incluyan una conexión a las bases de datos, ya que nos ofrece una serie de ventajas:

  • Abstracción de las complejidades de las bases de datos.
  • Productividad incrementada.
  • Agnosticismo de base de datos.
  • Gestión sencilla de esquemas y relaciones.
  • Seguridad mejorada.

Existen diferentes tipos de ORMs para poder trabajar con Javascript, entre ellos prisma, sequelize, MicroORM, etc.