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 deSequelize
.
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;
}
};**
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
.
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.
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.
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.
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.