Estaba revisando los ejemplos y la documentación de Sequelize el otro día, y encontré:
Albums.update(myAlbumDataObject, { where: { id: req.params.albumId }, returning: true /*or: returning: ['*'], depending on version*/ });Me emocioné mucho cuando vi esto. Una muy buena manera de evitar bastantes líneas de código. Lo que estaba haciendo antes era obtener el objeto mediante Model.findOne(), restablecer cada campo a sus nuevos valores e invocar el método de instancia .save(), en lugar de usar un método estático como ese.
No hace falta decir que estaba bastante feliz y satisfecho cuando vi que existía tal método estático, sin embargo, fue decepcionante saber que el método solo devuelve la instancia que actualiza si está ejecutando Sequelize con PostgreSQL.
Muy triste saber eso, ya que estoy usando MySQL.
El método, seguro, emite una instrucción SQL que contiene la cadena de ACTUALIZACIÓN adecuada, pero eso es todo. No sé si golpeó algo, y no tengo una copia de los datos actualizados para devolver.
Resulta que primero necesito un Model.findOne() para saber si ese objeto existe con esa identificación (y/u otros parámetros de filtrado), el Model.update() para emitir las actualizaciones y finalmente un Model.findByPk() para devolver el modelo actualizado a la capa superior (todo dentro de una transacción, naturalmente). ¡Eso es demasiado código!
Además, durante la actualización, si se lanza una excepción UniqueConstraintError (la bruja puede ser bastante común), su matriz de errores [] no contiene una 'instancia' de modelo válida, es simplemente 'indefinida', por lo que complica las cosas si desea detalles sobre lo que sucedió y /o lanzar mensajes de error personalizados definidos dentro de los modelos.
Mis preguntas son: ¿Existen soluciones alternativas mejores que las que ya estoy implementando? ¿Algún complemento de secuela que pueda darme eso con MySQL? Cualquier secuela de código beta que me puede dar eso? ¿Hay algún esfuerzo por parte del equipo de desarrollo de Sequelelize para darnos eso? Agradecería cualquier ayuda brindada.
Estoy ejecutando la versión Sequelize 6.7.0, con Node.js v14.17.5.
Ps .: Incluso me di cuenta ahora de que static Model.update() en MySQL incluso actualizará algo que no existe sin quejarse.