Los ORMs, acrónimo de "Object Relational Model", son una herramienta crucial en el desarrollo moderno, permitiendo la conexión con bases de datos de una manera más intuitiva y eficiente gracias a la programación orientada a objetos. La función principal de un ORM es transformar y mapear una base de datos a objetos de programación, haciendo que a la hora de interactuar con la base de datos, no sea necesario escribir complejas consultas SQL. En cambio, basta con ejecutar métodos ya definidos como find, create, o update. Esto no solo optimiza el tiempo de desarrollo, sino que además ofrece un enfoque agnóstico, permitiendo cambios rápidos entre bases de datos que utilizan SQL como MySQL, MariaDB o Postgres.
¿Por qué no debes olvidar SQL?
A pesar de las facilidades que ofrecen los ORMs, es fundamental no olvidar las bases de SQL. Hay ocasiones en que ciertas consultas avanzadas no pueden ser fácilmente replicadas con un ORM, por lo que una comprensión sólida de SQL sigue siendo esencial. Además, ser capaz de escribir y entender SQL te proporcionará una visión más profunda sobre cómo se manejan los datos en el sistema.
ORM en Node.js: Sequelize vs TypeORM
En el ecosistema de Node.js, los dos ORMs más reconocidos son Sequelize y TypeORM. Ambos ofrecen características similares, pero su integración varía en función del ambiente.
Sequelize: Se recomienda para proyectos en JavaScript debido a su excelente integración y manejo.
TypeORM: Ideal para proyectos que utilicen TypeScript por su compatibilidad y soporte.
¿Cómo configurar Sequelize?
Para trabajar con Sequelize, es esencial seguir algunos pasos básicos para su configuración e integración con la base de datos:
Instalación de Sequelize:
npminstall sequelize
Instalación de drivers acorde a la base de datos: Especialmente si se trabaja con Postgres, es común instalar librerías adicionales como pg para hacer la conexión efectiva.
Configuración de la conexión: Crear un archivo llamado sequelize.js donde se manejará la conexión y se definirá la gestión del pooling.
Sequelize se encarga de la gestión de conexiones utilizando el pooling, lo que optimiza el uso de recursos y asegura que la aplicación no se sature de conexiones abiertas. Además, reduce el tiempo de latencia y mejora el rendimiento general durante las operaciones con la base de datos.
Ejecución de consultas directas con Sequelize
Aunque Sequelize está diseñado para trabajar con programación orientada a objetos, permite la ejecución directa de consultas SQL cuando sea necesario:
sequelize.query('SELECT * FROM productos',{type:Sequelize.QueryTypes.SELECT}).then((data)=>{console.log("Data:", data);});
Es importante tener en cuenta que al ejecutar estas consultas, la información se devuelve como un array en dos partes: la primera posición contiene la data, y la segunda la metadata, que provee información adicional sobre la consulta realizada.
Fin del análisis preliminar
Con esta configuración y comprensión inicial de Sequelize, puedes comenzar a manipular datos de una base de datos PostgreSQL en un entorno Node.js. En la próxima etapa, te adentrarás en las capacidades más avanzadas de los ORMs, como el modelado de datos y la programación orientada a objetos, que permitiran explotar al máximo el potencial de estos sistemas. ¡Continúa aprendiendo y profundizando en este fascinante mundo de los ORMs!
💡Un ORM es un modelo de programación que permite mapear las estructuras de una base de datos relacionales.
.
Al abstraer este tipo de programación, delegamos su implementación al backend, es decir, le añadimos una de responsabilidad a la capa transaccional del servidor:
.
✨Los beneficios son los siguientes:
Acciones como CRUD (Create, Read, Update, Delete) son administradas mediante ORM.
La implementación de seeds o semillas, nos permiten recuperar, mediante código, la estructura de una BD.
.
Una de las bases teóricas para entender este modelo es mediante el conocimiento de DAO (Data Access Object) y DTO (Data Transfer Object), los cuales nos permiten desestructurar un ORM en módulos de abstracción para acceder a la DB y transferir datos desde la misma DB, respectivamente hablando.
.
🙃Los contras sería:
Delegación de responsabilidades al server
Descentralización de trabajo, directa, de una BD.
Buena explicación.
Tu aporte me aclaro varias dudas gracias 😁🖖
Si les sale el mensaje en consola:
[SEQUELIZE0002] DeprecationWarning: The logging-option should be either a function or false. Default: console.log
solo deben cambiar en lib/sequelize.js donde dejaron
logging:true
por
logging:console.log
hay una manera mas avanzada que es crear su propia función pero creo que ya será para después :)
Gracias, esto solucionó mi error, pero no estaría entendiendo el porqué le funcionó al profesor tener ```
logging:true
gracias, me funcionó
Un ORM (Object Relational Model) transforma y mapea nuestra BD con métodos de la programación orientada a objetos. Se pueden ejecutar métodos en lugar de consultas. La ventaja es que es agnóstico, no importa si se está usando MySQL, PostgreSQL, MariaDB, no hay problema mientras la BD use SQL.
Hay 2 ORM muy populares, se recomienda Sequelize para JavaScript y TypeORM para TypeScript.
Para instalarla → npm install --save sequelize
De acuerdo a la BD, se deben instalar los drivers:
La configuración y conexión se gestiona en la capa de librerías (libs), se crea el archivo sequelize.js:
const{Sequelize}=require('sequelize');const{ config }=require('../config/config');constUSER=encodeURIComponent(config.dbUser);constPASSWORD=encodeURIComponent(config.dbPassword);constURI=`postgres://${USER}:${PASSWORD}@${config.dbHost}:${config.dbPort}/${config.dbName}`;const sequelize =newSequelize(URI,{dialect:'postgres',logging:true});// Se crea una instancia de Sequelize, ya gestiona el pooling.module.exports= sequelize;
dialect → Para indicar que BD se está usando
logging → Cada vez que se haga una consulta con el ORM, en la consola se muestra el resultado o el igual en comando directo SQL.
--
Realizando consulta:
Archivo product.service.js:
const sequelize =require('../libs/sequelize');asyncfind(){const query ='SELECT * FROM tasks';const[data]=await sequelize.query(query);return data;}
En la respuesta se entrega un array, la primer posición entrega la data, y la segunda la metadata que contiene más información con contexto acerca del query.
También tuve ese error, lo que pasaba es que no tenia creado el archivo .env
Revisa si es eso.
Yo tuve un error semejante al momento de iniciar una peticion con postman pero fue solamente por no iniciar la base de datos xdxdxdxd
Hola a todos, alguno con es este mismo error:
estuve comparando linea a linea y esta igual que como el de Nico en la clase. sera un tema de version de sequelize?
revisa bien como lo exportaste y tambien si lo has importado correctamente
muero por llenar de datos la bd
Cada que cierro mi conexión y la vuelvo a abrir en pgadmin desaparece mi servidor y tengo que crearlo de nuevo. Según entendía que con los volumes esto no pasaría, tengo este código en esa parte:
Tienes que configurar volumes para pgadmin también. La carpeta dentro del contenedor es /var/lib/pgadmin y la carpeta externa la que tu quieras como lo hicimos con postgres.
nota los valores en ${ SON_VARIABLES_DE_ENTORNO }
Pregunta, los ORM son menos veloces? qué tanto?, yo he tenido la oportunidad de usar sequelize pero me parece que no le estoy sacando el jugo ya que las consultas que hago a la BD no son tan sencillas y me toca hacer el query en sql.
Saludos 👋
No es tanto el ORM, sino la infraestructura de trabajo. Inspecciona los recursos con los que cuenta tu entorno y revisa su latencia o pruebas de estrés.
Honestamente, un ORM es una capa de adicional de abstracción donde un administrador de BD puede realizar sin problemas y que, además, puede exponer mediante drivers preferentes o a doc.
Hola, en Abril de 2024
Ejecutando el codigo actual de la clase esta saliendo el siguiente mensaje, se envia por si te sale el mensaje como podrias corregirlo, Saludos:
(node:3567)[SEQUELIZE0002]DeprecationWarning:The logging-option should be either a function or false.Default:console.log(Use`node --trace-deprecation ...` to show where the warning was created)```se corrige en el archivo sequelize cambiando el loggin:true por loggin: console.log
```js
const sequelize =newSequelize(URI,{dialect:'postgres',logging:console.log,});
gracias, me funciono
por alguna razon no me funciono la conexion, pero despues de perder un dia, probe haciendola asi y me funciono:
var sequelize =newSequelize(config.dbName,USER,PASSWORD,{dialect:'postgres'})
En algun momento buscare otra solucion o que funcione lo del profe (que queda mas eficiente y elegante jeje) pero bueno esto es para que no sigan perdiendo time de life
Si no queremos que la función query que se ejecuta con sequelize retorne la meta data, podemos mandarle en un segundo parámetro un objeto con la siguiente configuración
{type:QueryTypes.SELECT}
Para que esto funcione debemos importar QueryTypes de la Liberia sequelize.
Quedaría algo así:
const{QueryTypes}=require('sequelize');const sequelize =require('../libs/sequelize.js');classProductsService{constructor(){this.products=[];this.generate();}asyncfind(){const query ='SELECT * FROM Tasks';const[data]=await sequelize.query(query,{type:QueryTypes.SELECT.});returnthis.products;}/* .... Más métodos */}
Espero este aporte les sea de utilidad.
Saludos y #NuncaParenDeAprender ??
Para los que vienen llegando en 2026 , porfavor ,revisen esta clase en github ,ya que este codigo esta obsoleto , en github esta actualizado ,a mi no me dejaba correrlo , SIEMPRE ME SALIA ERROR 426 , ENTONCES PARA QUE NO LES PASE , BUSQUENLO EN GITHUB
LOS PROBLEMATICOS SON :
product.service.js
y squelize.js
lo q yo hice fue En la terminal:
CTRL+Cnpm start
El problema ocurría porque en el proyecto se estaban usando funciones de Faker que no existen en la versión instalada. Específicamente, se utilizaron faker.string.uuid() y faker.image.url(), que pertenecen a versiones más nuevas de la librería, mientras que el entorno tenía Faker v7. Esto hacía que el servidor de Node se cayera al iniciar, y como consecuencia Postman mostraba el error 426 Upgrade Required porque la API en realidad no estaba corriendo.
La solución fue reemplazar esas funciones por las compatibles con la versión usada en el curso de Platzi: faker.datatype.uuid() y faker.image.imageUrl(), y luego reiniciar el servidor para que cargara correctamente.
Hola buen dia
Ahora que tenemos el archivo sequeleze, podemos eliminar el pool y service ? y en caso que no, me podrian explicar porque.
Antes lo usabamos en productos, pero ahor que se cambio veo que ya no se usa.
sip, puede eliminar, no lo estamos usando
el archivo en el que se hace el pool
Ahora que usamos sequelize en vez de pool, podemos eliminar el archivo postgres.js?
el pool viene con la dependencia pg la cual si la necesitas, el archivo postgres.js no lo necesitas ahora que tienes sequelize instalado ya que ese archivo esta considerado como malas practicas debido a que estas dejando el usuario y la contraseña desprotegida, toda esa informacion la pasamos al archivo .env para darle una mejor proteccion.
Hola gente, no se si soy solo yo, pero a veces me agrega en los datos de la db un /n. ¿Alguien sabe el porqué?
Les comparto el link de sequelize:
el "--save" que significa en este comando?
npm install --save sequelize
Se pueden tener dos tipos de dependencias instaladas en un proyecto, unas que se usarán sólo en el desarrollo, y otras que también se usarán en producción. Para esto el comando npm install recibe dos banderas, --save para guardar una dependencia que se usará en producción, y --save-dev para guardar dependencias de desarrollo. Por defecto, si se omite la bandera, la instancia se instala de producción.
La configuración
logging: true
Ya no es necesaria, por defecto sequelize va a loggear en la consola cada consulta SQL que realize.