NodeJS:如何将数据从主表迁移到两个表,其顺序与主站具有尽可能多的同步代码相同

问题描述 投票:0回答:1

这可以通过使用promises或async / await来完成吗?

例如:如果主表是(id,uuid,op_1,op_2),那么表应该是table1(id,uuid)table2(id,op_1,op_2)

具有与主表相同顺序的表1和2是具有尽可能多的同步代码的优先级。

javascript node.js asynchronous promise async-await
1个回答
0
投票

在某些情况下我们应该迁移数据,例如将一个表中的大数据拆分成多个表或将生产数据同步到本地等等......

这是我的解决方案:

  • 每隔10秒保持同步原始表中的数据(在crontab中创建一个任务),每次不超过1k项。
  • 以正序同步数据并将最新的ID存储到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)
          });
      });
}
© www.soinside.com 2019 - 2024. All rights reserved.