Je crée une API RESTful avec NodeJS, express, express-resource et Sequelize qui est utilisée pour gérer les ensembles de données stockés dans une base de données MySQL.
J'essaie de comprendre comment mettre à jour correctement un enregistrement à l'aide de Sequelize.
Je crée un modèle:
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
}
})
}
Ensuite, dans mon contrôleur de ressources, je définis une action de mise à jour.
Ici, je veux être en mesure de mettre à jour l'enregistrement où l'id correspond à une req.params
variable.
Je construis d'abord un modèle, puis j'utilise la updateAttributes
méthode pour mettre à jour l'enregistrement.
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')
}
Maintenant, cela ne produit pas réellement une requête de mise à jour comme je m'y attendais.
Au lieu de cela, une requête d'insertion est exécutée:
INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)
Ma question est donc la suivante: quelle est la bonne façon de mettre à jour un enregistrement à l'aide de Sequelize ORM?
la source
.success
pour.then
Project.findOne(
?findByPk(req.params.id)
qui renvoie une instance.Depuis la version 2.0.0, vous devez encapsuler votre clause where dans une
where
propriété:Mise à jour 09/03/2016
La dernière version n'utilise en fait plus
success
eterror
utilise à la place desthen
promesses utilisables.Ainsi, le code supérieur ressemblera à ceci:
Utiliser async / await
http://docs.sequelizejs.com/en/latest/api/model/#updatevalues-options-promisearrayaffectedcount-affectedrows
la source
Depuis sequelize v1.7.0, vous pouvez désormais appeler une méthode update () sur le modèle. Beaucoup plus propre
Par exemple:
la source
Et pour les personnes à la recherche d'une réponse en décembre 2018, voici la syntaxe correcte utilisant les promesses:
la source
Réponse de janvier 2020
Ce qu'il faut comprendre, c'est qu'il existe une méthode de mise à jour pour le modèle et une méthode de mise à jour distincte pour une instance (enregistrement).
Model.update()
met à jour TOUS les enregistrements correspondants et renvoie un tableau voir la documentation Sequelize .Instance.update()
met à jour l'enregistrement et renvoie un objet d'instance.Donc, pour mettre à jour un seul enregistrement par question, le code ressemblerait à ceci:
Donc, utilisez
Model.findOne()
ouModel.findByPkId()
pour obtenir un handle une seule instance (enregistrement), puis utilisez leInstance.update()
la source
Je pense
UPDATE ... WHERE
qu'en utilisant comme expliqué ici et voici une approche leanla source
Cette solution est obsolète
donc vous devez utiliser
Cordialement
la source
Utiliser async et await dans un javascript Es6 moderne
vous pouvez renvoyer le résultat ...
la source
mise à jour statique publique (valeurs: objet, options: objet): promesse>
vérifier la documentation une fois http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update
la source
Vous pouvez utiliser la méthode Model.update ().
Avec async / await:
Avec .then (). Catch ():
la source
salut pour mettre à jour l'enregistrement c'est très simple
result.feild = updatedField
la source
Si vous cherchez ici un moyen d'incrémenter une valeur de champ spécifique dans un modèle ...
Cela a fonctionné pour moi à partir de
[email protected]
User.increment("field", {by: 1, where: {id: 1});
RÉF: https://github.com/sequelize/sequelize/issues/7268
la source
Il existe deux façons de mettre à jour l'enregistrement dans sequelize.
Tout d'abord, si vous avez un identifiant unique, vous pouvez utiliser la clause where ou bien si vous souhaitez mettre à jour plusieurs enregistrements avec le même identifiant.
Vous pouvez soit créer l'objet entier à mettre à jour, soit une colonne spécifique
Mettre à jour uniquement une colonne spécifique
Deuxièmement, vous pouvez utiliser rechercher une requête pour la trouver et utiliser la fonction set and save pour mettre à jour le DB.
Utilisez toujours la transaction lors de la mise à jour ou de la création d'une nouvelle ligne. de cette façon, il annulera toutes les mises à jour s'il y a une erreur ou si vous effectuez plusieurs mises à jour:
la source