Пейджинговый запрос с NodeJS и ObjectionJs
Привет, я относительно новичок в NodeJS и использую ObjectionJS в качестве ORM. Я хочу сделать скрипт миграции для моей таблицы пользователей, чтобы изменить некоторые поля каждой строки.
Я делаю что-то вроде этого
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 ответ
Решение
Я добился этого с помощью 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;
}
}
}
}