在Node.js中使用Cloud Spanner进行插值查询

Jac*_*sen 2 node.js google-cloud-platform google-cloud-spanner

我正在尝试使用Node.js中的Cloud Spanner lib向我的扳手查询中动态添加LIMITORDER 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方法生成的插值结果也将很有帮助,我不确定是否/如何查看。

Joh*_*win 5

从Cloud Spanner的文档中查询参数

查询参数可用于替换任意表达式。但是,它们不能用于替代标识符,列名,表名或查询本身的其他部分。

ORDER BY表达式是列名,不是查询参数的受支持类型。在这种情况下,您需要插入查询字符串。