Я пытаюсь динамически добавить предложение LIMIT
и ORDER BY
к моему запросу на гаечный ключ, используя библиотеку Cloud Spanner в Node.js:
function getPosts (query) {
const { limit, start, sortBy, sortOrder } = query;
delete query.start;
delete query.limit;
delete query.sortBy;
delete query.sortOrder;
const meta = {};
let limitClause = '';
let sortClause = '';
if (limit) {
limitClause = `
LIMIT @limit
OFFSET @start
`;
meta.limit = limit && parseInt(queryObj.limit, 10);
meta.start = start ? parseInt(start, 10) : 0;
}
if (sortBy) {
sortClause = `ORDER BY @sortBy ${(sortOrder && sortOrder.match(/^desc/i)) ? 'DESC' : 'ASC'}`;
meta.sortBy = sortBy;
}
const [postsRows] = await myDatabase.run({
sql: `
SELECT *
FROM posts@{FORCE_INDEX=posts_userId}
WHERE userId = @userId
${sortClause}
${limitClause}
`,
params: { userId, ...meta },
});
return orderRows;
}
Обратите внимание, что myDatabase
являетсяэкземпляр Шпаннера.(https://cloud.google.com/nodejs/docs/reference/spanner/2.0.x/Spanner)
В настоящее время предложение LIMIT
работает, как и ожидалось, но ответ выглядит так, как будто предложение ORDER BY
игнорируется.
Если заменить 2-е, еслиоператор с
if (sortBy) {
sortClause = `ORDER BY ${sortBy} ${(sortOrder && sortOrder.match(/^desc/i)) ? 'DESC' : 'ASC'}`;
}
Тогда он работает, как и ожидалось, но я не хочу интерполировать необработанные строки в мой запрос следующим образом.
Я не уверен, как именно параметры интерполируются взапрос, но он работает для переменных userId, limit и start.
Было бы также полезно увидеть результат интерполяции, которую производит метод run экземпляра Spanner, я не уверен, если / какЯ могу это видеть.