2017-10-07 3 views
0

Ich verwende die Migration, um die Position für Nachrichten basierend auf Benutzern zu aktualisieren. Ich meine, ich werde abfragen, um Benutzer von DB zu bekommen, also vom Benutzer, ich bekomme Nachrichten und aktualisiere Position für sie. ich Sequenzposition fürWarten auf die Ausführung der Abfrage vor dem Abschluss der Migration auf Orientjs

Nachricht erhöhen

Version 1: meinen Code unten

"use strict"; 
const async = require('async'); 

exports.name = "add position for message"; 
exports.up = function (db) { 
    return db.select('uuid').from('User').all().then(function(users) { 
    return users.forEach(function(user) { 
     console.log('each user', user.uuid); 
     db.query(`CREATE SEQUENCE positionMessage${user.uuid} TYPE ORDERED`); // SQL CREATE SEQUENCE 

     return db.query(`select uuid from Message where in('has_message').uuid = :userUuid`, { 
     params: { 
      userUuid: user.uuid 
     } 
     }) 
     .then(function(messages) { 
     console.log('messages', messages.length); // result => get full messages with 2500 messages. 
     return messages.forEach(function(message) { 
      console.log('message uuid', message.uuid); 
      return db.query(`UPDATE Message SET position = sequence('positionMessage${user.uuid}').next() where uuid = :uuid`, { 
      params: { 
       uuid: message.uuid 
      } 
      }) 
      .then(function(err) { 
      console.log(err); 
      }) 
     }) 
     }) 
    }) 
    }) 
}; 

exports.down = function (db) { 
    db.select('uuid').from('User').all().then(function(users) { 
    users.forEach(function(user) { 
     db.query(`DROP SEQUENCE positionMessage${user.uuid}`); // SQL DROP SEQUENCE 
    }) 
    }) 
    return db.query(`UPDATE Message REMOVE position`) 
}; 

==> Ergebnis sehen: beendet mit einigen Nachrichten aktualisiert wird. Anzahl ist ungefähr 5-> 50 Datensätze wird aktualisiert. (Gesamt Meldungen sind in DB: 2500)

I Verwendung asynchrones Wasser fällt versucht habe, die jeweils ... meinen Code unten Version siehe 2:

"use strict"; 
const async = require('async'); 

exports.name = "add position for message"; 
exports.up = function (db) { 

    return async.waterfall([ 
    function getUser(callback) { 
     return db.select('uuid').from('User').all().then(function(users) 
     { 
     callback(null, users); 
     }) 
    }, 
    function getMessageForUser(users, callback) { 
    //getMessageForUser 
    return async.each(users, function (user, callback) { 
     // run to async each users 
     db.query(`CREATE SEQUENCE positionMessage${user.uuid} TYPE ORDERED`); // SQL CREATE SEQUENCE 
     return db.query(`select uuid from Message where in('has_message').uuid = :userUuid`, { 
     params:{ 
      userUuid: user.uuid 
     } 
     }) 
     .then(function(messages) { 
     return async.each(messages, function(message, callback) { 
      // go to async each messages 
      return db.query(`UPDATE Message SET position = sequence('positionMessage').next() where uuid = ${message.uuid}`) 
      .then(function (response) { 
       // updated position for message 
       callback(); 
      }) 
     }, function doneEachMessage(err) { 
      //doneEachMessage 
      callback(err); 
     }) 
     }) 
    }, function doneEachUser(err) { 
     // doneEachUser 
     callback(err); 
     }) 
    } 
    ], function doneWaterFall(err) { 
    console.log('doneWaterFall'); 
    }) 
}; 

exports.down = function (db) { 
    db.select('uuid').from('User').all().then(function(users) { 
    users.forEach(function(user) { 
     db.query(`DROP SEQUENCE positionMessage${user.uuid}`); // SQL DROP SEQUENCE 
    }) 
    }) 
    return db.query(`UPDATE Message REMOVE position`) 
}; 

Ergebnis: => Es ist nichts passiert .

orientjs Version ich verwende ist 2.2.6

Ich weiß nicht, was ich falsch mache. Kann mir jemand für eine Lösung helfen? Vielen Dank!

Antwort

0

Ich löste mein Problem mithilfe der Promise-Funktion. Hier ist es:

"use strict"; 
const async = require('async'); 

exports.name = "add position for message"; 
exports.up = function (db) { 
    return new Promise(function (resolve, reject) { 
    db.select('uuid').from('User').all().then(function(users) { 
     async.each(users, function(user, callback) { 
     console.log('VP - loop to update message for user has uuid: ', user.uuid); 
     db.query(`CREATE SEQUENCE positionMessage${user.uuid} TYPE ORDERED`); // SQL CREATE SEQUENCE 
     db.query(`select uuid, @rid as rid from Message where in('has_message').uuid = :userUuid`, { 
      params: { 
      userUuid: user.uuid 
      } 
     }) 
     .then(function(messages) { 
      console.log('VP - count messages need to update position: ', messages.length); 
      async.each(messages, function(message, callback) { 
      db.query(`UPDATE Message SET position = sequence('positionMessage${user.uuid}').next() where uuid = :uuid`, { 
       params: { 
       uuid: message.uuid 
       } 
      }) 
      .then(function(err) { 
       console.log('VP - Executed update position for message have uuid: ', message.uuid); 
       callback(err); 
      }) 
      }, function doneEachMessage(err) { 
      callback(err); 
      }) 
     }) 
     }, function doneEachuser(err) { 
     resolve('Success!'); // resolved the promise 
     }) 
    }) 
    }); 
}; 

exports.down = function (db) { 
    db.select('uuid').from('User').all().then(function(users) { 
    users.forEach(function(user) { 
     db.query(`DROP SEQUENCE positionMessage${user.uuid}`); // SQL DROP SEQUENCE 
    }) 
    }) 
    db.query(`UPDATE Message REMOVE position`) 
}; 

Und jetzt, das Skript wartet auf alle Abfragen vor dem Abschluss der Migration.

Verwandte Themen