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)
)
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]
})