varios update sentencia registros registro modificar ejemplo campo actualizar mysql node.js express sequelize.js

mysql - sentencia - update sql server ejemplo



¿Cómo actualizar un registro usando la secuencia para nodo? (6)

Estoy creando una API RESTful con NodeJS, express, express-resource y Sequelize que se usa para administrar datasets almacenados en una base de datos MySQL.

Estoy intentando descubrir cómo actualizar correctamente un registro usando Sequelize.

Yo 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 el id coincide con una variable de req.params .

Primero construyo un modelo y luego uso el método updateAttributes 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 no produce una consulta de actualización como era de 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?


Creo que usar UPDATE ... WHERE como se explica here y sequelize.readthedocs.org/en/latest/api/model/… es un enfoque esbelto

Project.update( { title: ''a very different title no'' } /* set attributes'' value */, { where: { _id : 1 }} /* where criteria */ ).then(function(affectedRows) { Project.findAll().then(function(Projects) { console.log(Projects) })


Desde la secuenciación v1.7.0 ahora puede llamar a un método update () en el modelo. Mucho más limpio

Por ejemplo:

Project.update( // Set Attribute values { title:''a very different title now'' }, // Where clause / criteria { _id : 1 } ).success(function() { console.log("Project with id =1 updated successfully!"); }).error(function(err) { console.log("Project update failed !"); //handle error here });


Desde la versión 2.0.0, debe ajustar su cláusula where en una propiedad where :

Project.update( { title: ''a very different title now'' }, { where: { _id: 1 } } ) .success(result => handleResult(result) ) .error(err => handleError(err) )

Actualización 2016-03-09

La última versión en realidad ya no usa el success y el error sino que usa promesas que se pueden usar.

Entonces, el código superior se verá de la siguiente manera:

Project.update( { title: ''a very different title now'' }, { where: { _id: 1 } } ) .then(result => handleResult(result) ) .catch(err => handleError(err) )

http://docs.sequelizejs.com/en/latest/api/model/#updatevalues-options-promisearrayaffectedcount-affectedrows


Esta solución está en desuso

failure | fail | error () está en desuso y se eliminará en 2.1, por el contrario use promise-style.

entonces tienes que usar

Project.update( // Set Attribute values { title: ''a very different title now'' }, // Where clause / criteria { _id: 1 } ).then(function() { console.log("Project with id =1 updated successfully!"); }).catch(function(e) { console.log("Project update failed !"); })

Y también puedes usar .complete()

Saludos


No he usado Sequelize , pero después de leer su documentación, es obvio que estás instanciando un nuevo objeto , por eso Sequelize inserta un nuevo registro en la base de datos.

Primero necesita buscar ese registro, buscarlo y solo después de eso, cambiar sus propiedades y update , por ejemplo:

Project.find({ where: { title: ''aProject'' } }) .on(''success'', function (project) { // Check if record exists in db if (project) { project.updateAttributes({ title: ''a very different title now'' }) .success(function () {}) } })


actualización estática pública (valores: Objeto, opciones: Objeto): Promesa>

compruebe la documentación una vez http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update

Project.update( // Set Attribute values { title:''a very different title now'' }, // Where clause / criteria { _id : 1 } ).then(function(result) { //it returns an array as [affectedCount, affectedRows] })