No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

¿Qué es un ORM? Instalación y configuración de Sequelize ORM

9/27
Recursos

Aportes 32

Preguntas 13

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

ORM

💡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.

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 😃

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:

# One of the following:
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server

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');

const USER = encodeURIComponent(config.dbUser);
const PASSWORD = encodeURIComponent(config.dbPassword);
const URI = `postgres://${USER}:${PASSWORD}@${config.dbHost}:${config.dbPort}/${config.dbName}`;

const sequelize = new Sequelize(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');

async find() {
    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.

comandos

 npm install --save sequelize

npm install --save pg-hstore

Si quieren buscar la documentación de algún paquete solamente hagan el comando

npm docs <paquete>

Documentación de Sequelize

Estoy estancado con este error, alguien tiene alguna idea de que puede ser? Gracias de antemano.

parent: Error: getaddrinfo ENOTFOUND undefined
at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:71:26) {
errno: -3007,
code: ‘ENOTFOUND’,
syscall: ‘getaddrinfo’,
hostname: ‘undefined

muero por llenar de datos la bd

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: ```js (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 = new Sequelize(URI, { dialect: 'postgres', logging: console.log, }); ```

por alguna razon no me funciono la conexion, pero despues de perder un dia, probe haciendola asi y me funciono:

var sequelize = new Sequelize(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');

class ProductsService {
  constructor() {
      this.products = [];
      this.generate();
  }
  async find() {
     const query = 'SELECT * FROM Tasks';
     const [data] = await sequelize.query(query, {
		type: QueryTypes.SELECT.
      });
      return this.products;
  }

/* .... Más métodos */
}

Espero este aporte les sea de utilidad.
Saludos y #NuncaParenDeAprender ??

el "--save" que significa en este comando? npm install --save sequelize
La configuración `logging: true` Ya no es necesaria, por defecto sequelize va a loggear en la consola cada consulta SQL que realize. <https://sequelize.org/docs/v6/getting-started/#logging>
(node:7795) [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)

Lo que nos está diciendo es que el loging-option debe tener una función o un false, y ahí mismo nos está sugiriendo usar la función console.log por lo cual podemos cambiar esa opción por

  logging: console.log

npm i sequelize

  • Buscar en sequelize lo necesario para la bd con al que este trabajando

  • Crea carpeta lib

    • Crea archivo sequelize.js
    • Importa Sequelize y le pasa el string de conexion que esta en postgres.pool.js
    • Crea una instancia de Sequelize pasando como parametros la URI objeto que contiene :
      • dialect , que es el dialecto para conectar a la base de datos que estamos usando.
      • loggin: console.log para ver las consultas sql que se crean y ejecutan.

-Uso :
En el servicio podemos importar sequelize y ejecutar consultar directas por ejemplo:

const rta=await sequelize.query(query a ejecutar); -> esto devuelve un array de objetos.
const rta [data,metadata]

entonces podemos devolver
const data = await sequelize.query(query a ejecutar);

Comparto los métodos crear, actualizar, y borrar con sequelize.

Soy yo o los últimos 10s del vídeo no se escuchan?

No recordaba que se podía desestructurar un array! Así como se hace con los objetos

const [data, metadata] = await sequelize.query(query);
Que significa "Mapear" ?
curso de hace 4 años donde habia una narrativa filosófica de pandemia de no creer en nada y ahora escuchar un termino de "agnostico" para temas de tecnología raya en lo rídiculo.
Les comparto el link de sequelize: <https://sequelize.org/docs/v6/>

Otros ORMs más recientes y que me gustan bastante son

  • Prisma
  • Drizzle

configurando el archivo sequelize

Instalando Sequelize

¿Qué es un ORM (Object Relational Model)?: Es una capa que se le agrega al proyecto para conectarnos a la base de datos y manipular las conexiones con el paradigma de Objetos

instalamos dependencias

npm install --save sequelize
npm install --save pg pg-hstore

creamos conexión
libs/sequelize.js:

const { Sequelize } = require('sequelize')
const { config } = require('../config/config')

const USER = encodeURIComponent(config.dbUser)
const PASSWORD = encodeURIComponent(config.dbPassword)
const URI = `postgres://${USER}:${PASSWORD}@${config.dbHost}:${config.dbPort}/${config.dbName}`

const sequelize = new Sequelize(URI, {
  dialect: 'postgres',
  logging: true
})

module.exports = sequelize

reemplazamos servicios
service/product.service.js:

const sequelize = require('../libs/sequelize') 

class ProductsService {
  constructor(){
    this.products = [];
    this.generate();
  }

  generate() {
    ....
  }

  async create(data) {
    .....
  }

  async find() {
    const query = 'SELECT * FROM task'
    const [data] = await sequelize.query(query) 
    return data
  }

  async findOne(id) {
    .....
  }

  async update(id, changes) {
    ....
  }

  async delete(id) {
    ....
  }

}


module.exports = ProductsService;

Hola, hace muchísimo tiempo que estoy teniendo este error:

ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:5432
    at Client._connectionCallback (/mnt/c/Users/USUARIO/Programming/prueba/node_modules/sequelize/lib/dialects/postgres/connection-manager.js:131:24)
    at Client._handleErrorWhileConnecting (/mnt/c/Users/USUARIO/Programming/prueba/node_modules/pg/lib/client.js:305:19)
    at Client._handleErrorEvent (/mnt/c/Users/USUARIO/Programming/prueba/node_modules/pg/lib/client.js:315:19)
    at Connection.emit (node:events:394:28)
    at Socket.reportStreamError (/mnt/c/Users/USUARIO/Programming/prueba/node_modules/pg/lib/connection.js:52:12)
    at Socket.emit (node:events:394:28)
    at emitErrorNT (node:internal/streams/destroy:157:8)
    at emitErrorCloseNT (node:internal/streams/destroy:122:3)
    at processTicksAndRejections (node:internal/process/task_queues:83:21) {
  parent: Error: connect ECONNREFUSED 127.0.0.1:5432
      at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1142:16) {
    errno: -111,
    code: 'ECONNREFUSED',
    syscall: 'connect',
    address: '127.0.0.1',
    port: 5432
  },
  original: Error: connect ECONNREFUSED 127.0.0.1:5432
      at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1142:16) {
    errno: -111,
    code: 'ECONNREFUSED',
    syscall: 'connect',
    address: '127.0.0.1',
    port: 5432
  }
}

LA URL :

URI=postgres://${USER}:${PASSWORD}@${config.dbHost}:${config.dbPort}/${config.dbName};

[
	{
		"id": 1,
		"title": "Tarea 1",
		"completed": false
	},
	{
		"id": 2,
		"title": "Tarea 2",
		"completed": false
	}
]

Este curso me recuerda mucho a Laravel.

Les comparto este video sobre sequelize. Ver otra forma de hacer las cosas ayuda a conseguir una mejor comprensión:

Sequelize REST API (usando Postgres)

Otro herramienta que me gusta mucho ocupar es el de prisma dejor el link si algien le interesa usar uno direfrente link, algo que me agrada es que para generar las bases de datos la sintaxis es mas parecida a SQL.

Les recomiendo tambien instalar el cli de sequelize, este permite tener comandos por consola para crear modelos, hacer migraciones entre otras opciones, las dejo mas delante
Este se instala con npm install --save-dev sequelize-cli

Sequelize CLI [Node: 10.21.0, CLI: 6.0.0, ORM: 6.1.0]

sequelize <command>

Commands:
  sequelize db:migrate                        Run pending migrations
  sequelize db:migrate:schema:timestamps:add  Update migration table to have timestamps
  sequelize db:migrate:status                 List the status of all migrations
  sequelize db:migrate:undo                   Reverts a migration
  sequelize db:migrate:undo:all               Revert all migrations ran
  sequelize db:seed                           Run specified seeder
  sequelize db:seed:undo                      Deletes data from the database
  sequelize db:seed:all                       Run every seeder
  sequelize db:seed:undo:all                  Deletes data from the database
  sequelize db:create                         Create database specified by configuration
  sequelize db:drop                           Drop database specified by configuration
  sequelize init                              Initializes project
  sequelize init:config                       Initializes configuration
  sequelize init:migrations                   Initializes migrations
  sequelize init:models                       Initializes models
  sequelize init:seeders                      Initializes seeders
  sequelize migration:generate                Generates a new migration file      [aliases: migration:create]
  sequelize model:generate                    Generates a model and its migration [aliases: model:create]
  sequelize seed:generate                     Generates a new seed file           [aliases: seed:create]

Options:
  --version  Show version number                                                  [boolean]
  --help     Show help                                                            [boolean]

Please specify a command