Интерполяция запросов с помощью Cloud Spanner в Node.js - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь динамически добавить предложение LIMIT и ORDER BY к моему запросу на гаечный ключ, используя библиотеку Cloud Spanner в Node.js:

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 являетсяэкземпляр Шпаннера.(https://cloud.google.com/nodejs/docs/reference/spanner/2.0.x/Spanner)

В настоящее время предложение LIMIT работает, как и ожидалось, но ответ выглядит так, как будто предложение ORDER BY игнорируется.

Если заменить 2-е, еслиоператор с

if (sortBy) {
    sortClause = `ORDER BY ${sortBy} ${(sortOrder && sortOrder.match(/^desc/i)) ? 'DESC' : 'ASC'}`;
  }

Тогда он работает, как и ожидалось, но я не хочу интерполировать необработанные строки в мой запрос следующим образом.

Я не уверен, как именно параметры интерполируются взапрос, но он работает для переменных userId, limit и start.

Было бы также полезно увидеть результат интерполяции, которую производит метод run экземпляра Spanner, я не уверен, если / какЯ могу это видеть.

1 Ответ

0 голосов
/ 13 сентября 2018

Из документации Cloud Spanner о параметрах запроса :

Параметры запроса могут использоваться для подстановки произвольных выражений.Однако их нельзя использовать для подстановки идентификаторов, имен столбцов, имен таблиц или других частей самого запроса.

Выражение ORDER BY - это имя столбца, которое не поддерживается типомпараметра запроса.В этом случае вам нужно будет выполнить интерполяцию в строку запроса.

...