在 Node.js 中使用 Cloud Spanner 插入查询
Interpolating Query with Cloud Spanner in Node.js
我正在尝试使用 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 实例的 运行 方法生成的插值结果也很有帮助,我不确定 if/how 我是否可以查看。
来自 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 中的 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 实例的 运行 方法生成的插值结果也很有帮助,我不确定 if/how 我是否可以查看。
来自 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 表达式是一个列名,它不是受支持的查询参数类型。在这种情况下,您需要插入查询字符串。