Estoy creando una API RESTful con NodeJS, express, express-resource y Sequelize que se usa para administrar conjuntos de datos almacenados en una base de datos MySQL.
Estoy tratando de averiguar cómo actualizar correctamente un registro usando Sequelize.
Creo un modelo:
module.exports = function (sequelize, DataTypes) {
return sequelize.define('Locale', {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
locale: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
len: 2
}
},
visible: {
type: DataTypes.BOOLEAN,
defaultValue: 1
}
})
}
Luego, en mi controlador de recursos, defino una acción de actualización.
Aquí quiero poder actualizar el registro donde la identificación coincide con una req.paramsvariable.
Primero construyo un modelo y luego uso el updateAttributesmétodo para actualizar el registro.
const Sequelize = require('sequelize')
const { dbconfig } = require('../config.js')
// Initialize database connection
const sequelize = new Sequelize(dbconfig.database, dbconfig.username, dbconfig.password)
// Locale model
const Locales = sequelize.import(__dirname + './models/Locale')
// Create schema if necessary
Locales.sync()
/**
* PUT /locale/:id
*/
exports.update = function (req, res) {
if (req.body.name) {
const loc = Locales.build()
loc.updateAttributes({
locale: req.body.name
})
.on('success', id => {
res.json({
success: true
}, 200)
})
.on('failure', error => {
throw new Error(error)
})
}
else
throw new Error('Data not provided')
}
Ahora, esto en realidad no produce una consulta de actualización como cabría esperar.
En su lugar, se ejecuta una consulta de inserción:
INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)
Entonces mi pregunta es: ¿Cuál es la forma correcta de actualizar un registro usando Sequelize ORM?
fuente

.successa.thenProject.findOne(?findByPk(req.params.id)que devuelve una instancia.Desde la versión 2.0.0, debe ajustar su cláusula where en una
wherepropiedad:Actualización 2016-03-09
La última versión en realidad ya no usa
successy,errorsino que usathenpromesas -able.Entonces, el código superior se verá de la siguiente manera:
Usando async / await
http://docs.sequelizejs.com/en/latest/api/model/#updatevalues-options-promisearrayaffectedcount-affectedrows
fuente
Desde sequelize v1.7.0, ahora puede llamar a un método update () en el modelo. Mucho mas limpio
Por ejemplo:
fuente
Y para las personas que buscan una respuesta en diciembre de 2018, esta es la sintaxis correcta usando promesas:
fuente
Respuesta de enero de 2020
Lo que hay que entender es que hay un método de actualización para el modelo y un método de actualización independiente para una instancia (registro).
Model.update()actualiza TODOS los registros coincidentes y devuelve una matriz, consulte la documentación de Sequelize .Instance.update()actualiza el registro y devuelve un objeto de instancia.Entonces, para actualizar un solo registro según la pregunta, el código se vería así:
Entonces, use
Model.findOne()oModel.findByPkId()para obtener un identificador de una sola Instancia (registro) y luego use elInstance.update()fuente
Creo que usar
UPDATE ... WHEREcomo se explica aquí y aquí es un enfoque esbeltofuente
Esta solución está obsoleta
entonces tienes que usar
Saludos
fuente
Usando async y await en un javascript moderno Es6
puede devolver el resultado ...
fuente
actualización estática pública (valores: Objeto, opciones: Objeto): Promesa>
verifique la documentación una vez http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update
fuente
Puede utilizar el método Model.update ().
Con async / await:
Con. Then (). Catch ():
fuente
hola para actualizar el registro es muy simple
result.feild = updatedFieldfuente
Si está buscando una forma de incrementar un valor de campo específico en un modelo ...
Esto funcionó para mí a partir de
[email protected]User.increment("field", {by: 1, where: {id: 1});REF: https://github.com/sequelize/sequelize/issues/7268
fuente
Hay dos formas de actualizar el registro en secuencia.
Primero, si tiene un identificador único, puede usar la cláusula where o si desea actualizar varios registros con el mismo identificador.
Puede crear todo el objeto para actualizar o una columna específica
Actualizar solo una columna específica
En segundo lugar, puede usar buscar una consulta para encontrarla y usar la función establecer y guardar para actualizar la base de datos.
Utilice siempre la transacción al actualizar o crear una nueva fila. de esa manera, revertirá las actualizaciones si hay algún error o si realiza varias actualizaciones:
fuente