NodeJS: Как перенести данные из мастер-таблицы в две таблицы в том же порядке, что и мастер, имеющий как можно больше асинхронного кода - PullRequest
0 голосов
/ 03 апреля 2019

Будет ли это сделано с помощью обещаний или async / await?

Например: если главная таблица (id, uuid, op_1, op_2) тогда таблицы должны быть table1 (id, uuid) table2 (id, op_1, op_2)

Таблица 1 и 2, имеющая тот же порядок, что и главная таблица, является приоритетной с максимально возможным количеством асинхронного кода.

1 Ответ

0 голосов
/ 03 апреля 2019

В некоторых случаях мы должны переносить данные, например разбивать большие данные в одной таблице на несколько таблиц или синхронизировать производственные данные с локальными и т. Д. *

Вот мое решение:

  • продолжайте синхронизировать данные из исходной таблицы каждые 10 секунд (создайте задачу в crontab), и каждый раз будет не более 1 тыс. Элементов.

  • синхронизирует данные в положительной последовательности и сохраняет последний идентификатор в Redis.

Вот некоторые коды для вас:

var maxMigrateId = 0;
redis.get(maxMigrateIdKey, function (err, result) {
  if(err){
    console.error("[ERROR] - "+err)
  }
  if(result){
    maxMigrateId = result;
  }
  console.log('MaxMigrateId: ' + maxMigrateId);
      mysql_read_pool.query("select id , uuid from {your original table} where id > ? limit 1000", [maxMigrateId], function (err, results) {
        if(err){
          throw err;
        }
        console.log('[Query Result Length] - ' + results.length);
        var migratePromises = []
        migratePromises.push(migrateData(results, mysql_write_pool_prod))
        Promise.all(migratePromises).then(()=>{
          redis.set(maxMigrateIdKey, maxMigrateId);
          console.log('finished');
          process.exit();
        }).catch((err)=>{
          console.log('Error: '+err);
        })
      });
});

function async migrateData(items, write_pool){
      var sql = "insert into ${your target table} (id, uuid) values"
      var dataValues = []
      items.forEach((data)=>{
        var list = [data.id, data.uuid];
        var val = "('" + list.join("','") + "')";
        dataValues.push(val);
      });
      sql += dataValues.join(',');
      return new Promise((resolve, reject)=>{
          write_pool.query(sql, [], function (error, results, fields) {
              if (error){
                reject(error);
              }
              resolve(true)
          });
      });
}
...