73 votes

Sequelize - mise à jour de l'enregistrement, et retour du résultat

J'utilise sequelize avec MySQL. Par exemple, si je fais :

models.People.update({OwnerId: peopleInfo.newuser},
        {where: {id: peopleInfo.scenario.id}})
        .then(function (result) {
            response(result).code(200);

        }).catch(function (err) {
        request.server.log(['error'], err.stack);
       ).code(200);
    });

Je ne reçois pas d'information en retour pour savoir si le modèle de personnes a été mis à jour avec succès ou non. Le résultat de la variable est juste un tableau avec un élément, 0=1.

Comment puis-je savoir avec certitude si l'enregistrement a été mis à jour ou non ?

125voto

nickang Points 571

Voici ce que je pense que vous cherchez.

db.connections.update({
  user: data.username,
  chatroomID: data.chatroomID
}, {
  where: { socketID: socket.id },
  returning: true,
  plain: true
})
.then(function (result) {
  console.log(result);   
  // result = [x] or [x, y]
  // [x] if you're not using Postgres
  // [x, y] if you are using Postgres
});

De Sequelize docs : La promesse renvoie un tableau avec un ou deux éléments. Le premier élément x est toujours le nombre de lignes affectées, tandis que le deuxième élément y est le nombre réel de lignes affectées (seulement supporté dans postgres avec options.returning réglé sur true .)

En supposant que vous utilisez Postgres, vous pouvez accéder à l'objet mis à jour avec result[1].dataValues .

Vous devez définir returning: true pour indiquer à Sequelize de retourner l'objet. Et plain: true est juste de retourner l'objet lui-même et pas les autres méta-données désordonnées qui pourraient ne pas être utiles.

1 votes

J'utilise MySQL. Je vais le tester avec. Merci de votre réponse

28 votes

Je n'ai pas réussi à le faire fonctionner avec MySql. Je suppose que c'est une fonctionnalité réservée à Postgresql :(

7 votes

De plus, malgré ce que disent les docs, j'obtiens undefined comme premier paramètre et le nombre de lignes affectées comme deuxième paramètre (en utilisant sqlite). Pour résoudre ce problème, j'ai fait result = result.filter(Boolean); avant de traiter quoi que ce soit.

22voto

David Dehghan Points 1047

Vous pouvez simplement trouver l'élément et mettre à jour ses propriétés, puis l'enregistrer. La fonction save() donne lieu à une requête UPDATE dans la base de données.

const job = await Job.findOne({where: {id, ownerId: req.user.id}});
if (!job) {
    throw Error(`Job not updated. id: ${id}`);
}

job.name = input.name;
job.payload = input.payload;
await job.save();

Sur Postgres :

Executing (default): UPDATE "jobs" SET "payload"=$1,"updatedAt"=$2 WHERE "id" = $3

2 votes

C'est la solution la plus propre et la plus universelle. Nous vous remercions.

17voto

Tilekbekov Yrysbek Points 1364

La fonction de mise à jour de sequelize renvoie un nombre de lignes affectées (premier paramètre du tableau de résultats).

Vous devriez appeler find pour obtenir la ligne mise à jour

models.People.update({OwnerId: peopleInfo.newuser},
    {where: {id: peopleInfo.scenario.id}})
    .then(() => {return models.People.findById(peopleInfo.scenario.id)})
    .then((user) => response(user).code(200))
    .catch((err) => {
         request.server.log(['error'], err.stack);
      });

3 votes

Il semble donc que le seul moyen soit d'appeler find immédiatement après la mise à jour ?

0 votes

De toute façon vous devriez utiliser la fonction find.

3 votes

Vous pouvez appeler find d'abord, puis faire la mise à jour avec cet objet sans utiliser la fonction where

5voto

anu Points 89

J'ai enfin compris. Retourner true ne fonctionne pas dans mysql, nous devons utiliser findByPk dans l'ordre, j'espère que ce code vous aidera.

       return new Promise(function(resolve, reject) {
User.update({
        subject: params.firstName, body: params.lastName, status: params.status
    },{
        returning:true,
        where: {id:id }                             
    }).then(function(){
        let response = User.findById(params.userId);                      
        resolve(response);
    }); 

}) ;

4voto

La même chose que vous pouvez faire avec async-await, notamment pour éviter les Promesses imbriquées Il suffit de créer une fonction async :)

const asyncFunction = async function(req, res) {
    try {
        //update 
        const updatePeople = await models.People.update({OwnerId: peopleInfo.newuser},
                                    {where: {id: peopleInfo.scenario.id}})
        if (!updatePeople) throw ('Error while Updating');
        // fetch updated data
        const returnUpdatedPerson =  await models.People.findById(peopleInfo.scenario.id)
        if(!returnUpdatedPerson) throw ('Error while Fetching Data');
        res(user).code(200);
    } catch (error) {
        res.send(error)
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X