Я хочу реализовать разбиение на страницы для одной из моих таблиц. На внешнем интерфейсе я хочу сначала показать 50 строк, а следующие 50, когда пользователь переходит на следующие страницы. Для этого я использую следующие шаги: -
- Выполнить задание запроса
- Получить идентификатор задания
- Выполнить getQueryResults с этим идентификатором задания и получить результат и page_token
- Если page_token null - вы сделали, в противном случае переходите к следующему шагу
- Выполните getQueryResults (все еще с jobid из # 2) и получите результат и page_token Перейти к шагу # 4
Ниже это реальный код, который я написал для достижения этой цели, и он отлично работает в процессе разработки.
let options = token ? { 'pageToken': token, 'maxResults': maxRows } : { 'maxResults': maxRows };
if (!token) {
bigqueryClient.createQueryJob(query).then(function(data) {
const job = data[0];
return job.getQueryResults({ 'maxResults': maxRows });
}).then(function(data) {
if (data[1]) {
return res.json({ token: data[1]['pageToken'], rows: data[0], totalRows: data[2]['totalRows'] });
} else {
return res.json({ rows: data[0] });
}
})
.catch(e => {
log.error(e);
return res.status(500).json({
e: e.message
});
});
} else {
const job = bigqueryClient.job(jobId);
job.getQueryResults(options)
.then(function(data) {
if (data[1]) {
return res.json({ token: data[1]['pageToken'], rows: data[0] });
} else {
return res.json({ rows: data[0] });
}
})
.catch(e => {
log.error(e);
return res.status(500).json({
e: e.message
});
});
}
Кроме того, я отменяю предыдущие задания перед созданием нового для того же пользователя. Сейчас я скептически отношусь к тому, как задания повлияют на производительность базы данных, когда тысячи пользователей одновременно начнут ее использовать. Дайте мне знать, если это правильный путь, или я могу использовать другой подход.