ORM Sequelize en Node.js con Express.js

ORM Sequelize en Node.js con Express.js

ORM (Object-Relational Mapper) o Mapeo Objeto-Relacional en español, es una técnica utilizada para aproximar el paradigma POO (Programación Orientada a Objetos) al de base de datos relacional.

El uso de esta técnica ORM se lleva a cabo a través de un mapeador relacional de objetos, que suele ser una biblioteca o marco que ayuda con el mapeo y el uso de la base de datos.

Impedancia de datos

Al trabajar con aplicaciones orientadas a objetos que utilizan bases de datos relacionales para almacenar información, tenemos un problema que se conoce como impedancia relacional de objetos debido a las diferencias que tienen ambos paradigmas.

Una base de datos relacional trabaja con tablas y relaciones entre ellas para representar modelos de la vida real. Dentro de estas tablas tendremos varias columnas y la unidad que tendremos para representación en el modelo relacional será una fila, por ejemplo:

Tabla: Producto

id

nome

valor

descrição

1

Camisa

R$ 20,00

Algodão

2

Calça

R$ 80,00

Jeans


El paradigma orientado a objetos tiene una forma diferente de funcionar. En él tenemos elementos como clase, propiedades, visibilidad, herencia e interfaces. Cuando hablamos de orientación a objetos no utilizamos tablas sino el objeto que representa algo en el mundo real, ya sea abstracto o concreto. Por ejemplo:

Producto Objeto

ID: 1

Nombre: Camisa

Valor: R$ 20,00

Descripción: Algodón

Ahora bien, entendiendo la diferencia entre ambos, podemos comprender las principales dificultades que provocan las diferencias entre los paradigmas, son:

  • Representación de datos y modelo, considerando que las estructuras son distintas;
  • Modelo de integridad relacional de bases de datos relacionales;
  • Mapeo entre tipos de datos de bases de datos y lenguajes de programación.

Quizás te estés preguntando: “Está bien, pero ¿cómo soluciono este problema?”.

Fue con los problemas mencionados anteriormente en mente que surgió ORM, que define una técnica para llevar a cabo la “comunicación” entre estos dos modelos. Una de las características principales es mediante el mapeo de líneas a objetos.


Las bibliotecas o frameworks ORM definen cómo se mapearán los datos entre entornos, cómo se accederá a ellos y se escribirán en la base de datos, esto reduce en gran medida el tiempo necesario para el desarrollo, considerando que no es necesario desarrollar toda esta parte.

En otro artículo comentaré los distintos estándares que existen en el mercado para una mejor comprensión. Aquí usaremos Sequelize como demostración.

Sequelize es un ORM (Object-Relational Mapper) para Node.js que soporta múltiples bases de datos como MariaDB, MySQL, SQLite, PostgreSQL y como ORM se utiliza para asignar datos relacionales, como se indicó anteriormente (tablas, columnas y filas) a objetos JS.

Iniciando el proyecto

En primer lugar, necesitaremos crear un proyecto simple con Node.js. Comenzaré creando una carpeta para iniciar el proyecto y ejecutaré los siguientes comandos:


Después de ejecutar los comandos anteriores, habrá creado una carpeta con un archivo package.json dentro.


Con el proyecto iniciado, instalemos algunas dependencias necesarias:


Con las dependencias instaladas crearemos un archivo que será nuestro punto de partida para la aplicación, contendrá las configuraciones iniciales y el inicio del servidor. Para ello, crearemos un archivo index.js en la raíz del proyecto con el siguiente contenido insertado en él:


Para probar cómo funciona el proyecto, ejecute el comando node index.js. Luego accede a la dirección http://localhost:3000. Si todo funciona correctamente, se verá el mensaje ¡Iniciado!. Si todo está correcto, podemos pasar al siguiente paso que es la configuración de Sequelize.

Configurando Sequelize en el proyecto

Antes de comenzar a configurar Sequelize en el proyecto, debemos iniciarlo, esto significa que necesitamos crear los archivos de configuración, y para ello simplemente ejecuta el comando:


Después de ejecutar este comando, se deben crear algunos archivos en el proyecto, como las carpetas de config, migrations, models e seeders. Ten en cuenta que puedes ver que se crearon correctamente después de ejecutar el comando anterior.

Nuestro siguiente paso será cambiar el nombre del archivo config/config.json para config/database.js y alteraremos su contenido así:


Si quieres entender un poco más sobre las opciones de configuración existentes, te sugiero acceder a la documentación de Sequelize, pero, por lo general, estas configuraciones indican un usuario y contraseña que configuraste al instalar tu máquina, además del nombre de la tabla. que usaremos en el proyecto. Por lo tanto, crea la tabla con el nombre que quieras, para nuestro ejemplo usé crud_sequelize.

Una vez completadas las configuraciones anteriores, crearemos dos carpetas nuevas en la raíz del proyecto, la carpeta de la base de datos y la carpeta de la aplicación. Después de la creación, mueva los archivos migrations y seeders a la carpeta de la base de datos y a la carpeta de modelos en la aplicación, dejando la estructura así:

Nuestro siguiente paso será configurar Sequelize para encontrar los archivos en las carpetas que se movieron. Para hacer esto, en la raíz de su proyecto, crea un archivo llamado .sequelizerc e inserta el siguiente contenido en él:


Si deseas comprender más sobre la estructura del archivo anterior o para qué se utiliza exactamente, sugiero que accedas a la documentación de Sequelize.

Después del paso anterior, Sequelize ahora debería reconocer correctamente las rutas de sus archivos. Nuestro siguiente paso es configurar nuestros modelos de aplicación, son la representación de las tablas de la base de datos en forma de clase, para que podamos manipularlas más fácilmente a través de nuestro código.

Nuestro primer paso será configurar el archivo index.js ubicado en la ruta app/models/index.js, que será el encargado de importar los modelos de la aplicación. Su código actualizado con las nuevas funciones de ES6 debería verse así:


Antes de empezar y crear nuestro primer modelo, que será el modelo Usuario, necesitaremos hacer una configuración más, las migraciones. Las migraciones son los archivos que almacenan las versiones de la base de datos, por ejemplo, si tú o alguien de tu equipo realiza algún cambio en la estructura de la tabla, la migración se encarga de guardar este cambio para que el equipo pueda actualizar su base de datos con él.

Para crear nuestra primera migration, que será Usuario, ejecutaremos el siguiente comando:


Cuando se ejecuta el comando anterior se debe crear un archivo en tu carpeta de migraciones, al abrirlo verás una estructura de código con dos funciones, la función up, que indica qué modificar en la base de datos cuando ejecutamos la migration y la función down que actúa como um rollback, es decir, up hace y down deshace.

El archivo migration configurado para nuestra tabla Usuarios se verá así:


Para probar lo que hemos hecho hasta ahora, ejecutamos el comando:


Ten en cuenta que al ejecutar el comando anterior se produjo un error. Esto se debe a que Sequelize necesita un paquete de base de datos específico que definimos previamente en el archivo config/database.js. Como usaremos MySQL, necesitaremos el paquete mysql2:


Después de este paso, ejecute nuevamente el comando db:migrate que se muestra arriba y todo debería funcionar como se esperaba. Para verificar, abre tu base de datos y cerciórate de si las tablas SequelizeMeta y Users están en la base de datos crud_sequelize. La tabla SequelizeMeta guarda información sobre las migrations que ya se han ejecutado, de modo que en la siguiente ejecución, si no hay cambios, no es necesario ejecutar el comando. Solo si hay algo nuevo se ejecutará, pero no desde el principio.

Ahora crearemos el modelo de Usuarios. Para empezar, generaremos un archivo user.js dentro de la carpeta app/models y el archivo contendrá lo siguiente:


Ahora que las configuraciones están terminadas, solo queda probar si el modelo es funcional. Para hacerlo, agregaremos la importación al archivo app/models/index.js en el archivo index.js en la raíz del proyecto, quedando de la siguiente manera:

const { User } = require(‘./app/models’).

Y dado que el archivo es el de index, podemos evitar que se importe. A continuación, crearemos un usuario usando el comando de modelo proporcionado por Sequelize, con este aspecto:


Si todo va bien, cuando ejecutemos el proyecto con el comando node index.js se debería crear un registro en la base de datos crud_sequelize en la tabla Usuarios.

Finalmente crearemos los métodos CRUD directamente en las rutas del archivo index.js en la raíz del proyecto. Para crear las rutas usaremos:


Para terminar, aquí un ejemplo de la siguiente situación: Si quisiéramos crear una función para registrar un nuevo usuario, quedaría así:


Las demás funciones mencionadas anteriormente las dejo a la práctica de quienes estén leyendo el artículo.


Conclusión

Vimos que Sequelize es un gran facilitador cuando necesitamos desarrollar aplicaciones, considerando que tanto él como la mayoría de los ORM tienen como objetivo permitir que su base de datos se asigne a clases, abstrayendo toda la lógica de manipulación de datos.

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.