Comment mettre à jour un enregistrement en utilisant sequelize for node?

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 firebase database MySQL.

J’essaie de comprendre comment mettre à jour correctement un enregistrement en utilisant 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 pouvoir mettre à jour l’enregistrement où l’id correspond à une variable req.params .

D’abord, je construis un modèle, puis j’utilise la méthode updateAtsortingbutes 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.updateAtsortingbutes({ 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 prévu.

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) 

Donc, ma question est la suivante: quelle est la bonne façon de mettre à jour un enregistrement en utilisant Sequelize ORM?

    Je n’ai pas utilisé Sequelize , mais après avoir lu sa documentation, il est évident que vous instanciez un nouvel object , c’est pourquoi Sequelize insère un nouvel enregistrement dans la firebase database.

    D’abord, vous devez rechercher cet enregistrement, le récupérer et seulement après cela modifier ses propriétés et le mettre à jour , par exemple:

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

    Depuis la version 2.0.0, vous devez encapsuler votre clause where dans une propriété where :

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

    Mise à jour 2016-03-09

    La dernière version n’utilise plus le success et l’ error mais utilise plutôt des promesses réalistes.

    Ainsi, le code supérieur se présentera comme suit:

     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

    Depuis la suite v1.7.0, vous pouvez maintenant appeler une méthode update () sur le modèle. Beaucoup plus propre

    Par exemple:

     Project.update( // Set Atsortingbute 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 }); 

    Je pense en utilisant UPDATE ... WHERE comme expliqué ici et voici une approche allégée

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

    Cette solution est obsolète

    failure | fail | error () est obsolète et sera supprimé dans 2.1, veuillez utiliser plutôt le style promis.

    donc vous devez utiliser

     Project.update( // Set Atsortingbute 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 !"); }) 

    Et vous pouvez également utiliser .complete()

    Cordialement

    mise à jour statique publique (valeurs: Object, options: Object): Promise>

    vérifier la documentation une fois http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update

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