Jac*_*sen 2 node.js google-cloud-platform google-cloud-spanner
我正在尝试使用Node.js中的Cloud Spanner lib向我的扳手查询中动态添加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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这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'}`;
}
Run Code Online (Sandbox Code Playgroud)
然后它可以按预期工作,但是我不想像这样将原始字符串插入到我的查询中。
我不确定参数如何插值到查询中,但是它适用于userId,limit和start变量。
查看Spanner实例的run方法生成的插值结果也将很有帮助,我不确定是否/如何查看。
归档时间: |
|
查看次数: |
66 次 |
最近记录: |