您好我是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
块时异步执行查询,这是正确的吗?
如何在不进行一次返回所有用户的大型查询的情况下实现迁移?
提前致谢!!
答案 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;
}
}
}
}