Después de que hayamos definido y sincronizado los modelos de nuestra app ya podemos empezar a utilizar los diferentes métodos que nos ofrece Sequelize para hacer peticiones a la base de datos.

Los modelos que ya hemos sincronizado se encuentran dentro del objeto models de la instancia de Sequelize.

Este ORM nos da muchísimos métodos que ya están configurados y que con solo ejecutarlos ya podemos realizar consultas, inserciones y demás de una manera muy simple, además de que también nos da la opción de realizar consultas personalizadas si es que ninguno de los métodos preexistentes satisface nuestras necesidades.

Veamos el ejemplo de cómo hacer esto con un modelo llamado User en el respectivo servicio.

**const { sequelize: { models } } = require("./index");

class userService {
	constructor() {
		this.model = models.User;
	}
};**

Create

Para crear una fila dentro de alguna tabla de la base de datos, requerimos del modelo que representa dicha tabla, además de que debemos pasarle la información necesaria al método que nos provee el ORM y así evitar errores.

**async create(data) {
	const newUser = await this.model.create(data)
	return newUser;
};**

Todos los modelos contienen un método create que recibe la información que se necesita para crear una nueva fila y posteriormente se conecta a la base de datos para hacer el post.

Read

Sequelize nos provee con varios métodos para hacer consultas a la base de datos y leer la información que necesitemos.

**async findAll() {
	const users = await this.model.findAll();
	return users;
};

async findOne(id) {
	const user = await this.model.findByPk(id);
	if(!user) {
		throw new Error("The user wasn't found!");
	}	
	return user;
};**

Estos son los dos métodos más comunes para hacer consultas, findAll trae todas las filas de la tabla, mientras que findByPk encuentra la fila cuya primary key sea igual al valor que le pasamos como parámetro.

Update

Para actualizar una fila dentro de la base de datos primero necesitamos saber si dicha fila realmente existe y posteriormente ejecutar la actualización.

**async update(id, changes) {
	const user = await this.findOne(id); 
	//la lógica ya está creada en el método findOne, así que podemos reutilizar ese código.
	const response = await user.update(changes);
	return response;
};**

Lo primero que hacemos es llamar al método findOne, que está en la misma clase, este hace la petición a la base de datos y se asegura de que el valor retornado no sea null y que por lo tanto la fila de verdad exista. Si la fila existe, entonces podemos proseguir a utilizar el valor que nos devolvió la primera consulta y llamar a su método update con la nueva información que queremos actualizar.

Delete

El proceso que seguimos para eliminar filas es muy similar al que seguimos para actualizarlas.

**async delete(id) {
		const user = await this.findOne(id); 
		//la lógica ya está creada en el método findOne, así que podemos reutilizar ese código.
		const response = await user.destroy();
		return {
			"message": `Deleted row with id ${id}`
		};
}**

Lo primero que hacemos es llamar al método findOne, que está en la misma clase, este hace la petición a la base de datos y se asegura de que el valor retornado no sea null y que por lo tanto la fila de verdad exista. Si la fila existe, entonces podemos proseguir a utilizar el valor que nos devolvió la primera consulta y llamar a su método destroy que se encargará de hacer el delete correspondiente.

Queries personalizados

Sequelize también nos da la opción de hacer consultas personalizadas a través del método query.

**const { Sequelize } = require("sequelize");

const sequelize = new Sequelize("your URI string connection", {
	dialect: "your db",
});

const customQuery = async (query) => {
	const response = await sequelize.query(query);
	return response;
};

customQuery("some SQL code");**

De esta forma podemos cualquier cosa en la base de datos, no hay límites de lo que podemos hacer siempre y cuando sepamos manejar todo de manera correcta.