node.js - 在 Node.js 中使用 Cloud Spanner 插入查询

标签 node.js google-cloud-platform google-cloud-spanner

我尝试使用 Node.js 中的 Cloud Spanner 库向我的 Spanner 查询动态添加 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;
}

请注意,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/

相关文章:

javascript - 运行 Node 脚本时出错,找不到模块 'mongodb/node_modules/bson'

javascript - 从 Node.js 中的文件同步读取行

google-cloud-platform - 如何批量加载从其他来源生成的自定义 Avro 数据?

mysql - 使用 Cloud Spanner 从数据库中删除记录

node.js - 如何修复 npm 的全局位置?

node.js - 在终端错误中启动 Node/express 项目

node.js - 使用 NodeJS 从 GCP 的存储中下载对象

google-cloud-platform - 使用 TaggedOutputs 的数据流中断, "can' t pickle WeakDictionary”

python - 如何在Python中使用NDB查询从数据存储中删除数据?

sql - 联接如何在 Cloud Spanner 数据库中工作?