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.params
variable.
Primero construyo un modelo y luego uso el updateAttributes
mé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
.success
a.then
Project.findOne(
?findByPk(req.params.id)
que devuelve una instancia.Desde la versión 2.0.0, debe ajustar su cláusula where en una
where
propiedad:Actualización 2016-03-09
La última versión en realidad ya no usa
success
y,error
sino que usathen
promesas -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 ... WHERE
como 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 = updatedField
fuente
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