我尝试使用 Node.js 中的 Cloud Spanner 库向我的 Spanner 查询动态添加 LIMIT
和 ORDER BY
子句:
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
是 Spanner 的一个实例。 (https://cloud.google.com/nodejs/docs/reference/spanner/2.0.x/Spanner)
目前,LIMIT
子句按预期工作,但响应看起来好像 ORDER BY
子句被忽略。
如果我将第二个 if 语句替换为
if (sortBy) {
sortClause = `ORDER BY ${sortBy} ${(sortOrder && sortOrder.match(/^desc/i)) ? 'DESC' : 'ASC'}`;
}
然后它按预期工作,但我不想像这样将原始字符串插入到我的查询中。
我不确定参数是如何插入到查询中的,但它适用于 userId、limit 和 start 变量。
查看 Spanner 实例的 run 方法生成的插值结果也会很有帮助,我不确定是否/如何查看它。
最佳答案
来自 Cloud Spanner 的 documentation on query parameters :
Query parameters can be used in substitution of arbitrary expressions. They cannot, however, be used in substitution of identifiers, column names, table names, or other parts of the query itself.
ORDER BY 表达式是列名,它不是受支持的查询参数类型。在这种情况下,您需要插入查询字符串。
关于node.js - 在 Node.js 中使用 Cloud Spanner 插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52303509/