使用NodeJS和ObjectionJs分页查询

时间:2017-11-10 17:38:53

标签: node.js objection.js

您好我是NodeJS的新手,并且使用ObjectionJS作为ORM。 我想为我的users表做一个迁移脚本,以便更改每一行的某些字段。

我做了这样的事

export default class UserMigration {

  constructor(firstId, lastId = 9000000) {
    this.firstId = firstId;
    this.lastId  = lastId;
  }

  migrate() {
    let more = true;
    let page = 0;
    let batchSize = 100;
    while(more) {
      UserModel.query().where('id', '>=', this.firstId)
        .where('id', '<=', this.lastId)
        .page(page, batchSize)
        .then((result) => {
          let users = result.results;
          debug('Page: ', page);
          debug('PageSize: ', users.length)
          users.forEach((user) => {
            // Do something here
          });
          if(result.results.length < batchSize) {
            more = false
          } else {
            page++;
          }
        })
    }
  }

}

但后来我意识到在同步执行while块时异步执行查询,这是正确的吗?

如何在不进行一次返回所有用户的大型查询的情况下实现迁移?

提前致谢!!

1 个答案:

答案 0 :(得分:1)

我使用async/await

实现了这一目标
export default class UserMigration {

  constructor(firstId, lastId = 9000000) {
    this.firstId = firstId;
    this.lastId  = lastId;
  }

  run() {
    this.migrateV3().then((data) => {
      debug('All migrated');
      debug('data: ', data);
    }).catch((data) => {
      debug('Error');
      debug('data: ', data);
    });
  }

  async migrateV3() {
    let more = true;
    let page = 0;
    let batchSize = 100;
    while(more) {
      try {
        let result = await UserModel.query().where('id', '>=', this.firstId)
          .where('id', '<=', this.lastId)
          .page(page, batchSize);
        let users = result.results;
        debug('Page: ', page);
        debug('PageSize: ', users.length)
        for(let user of users) {
          debug(`User ${user.id} migration start`);
          // Do something
        };
        if(result.results.length < batchSize) {
          more = false
        } else {
          page++;
        }
      }
      catch (err) {
        throw err;
      }
    }
  }
}