NodeJS–добавить массив строк в запрос PostgreSQL

#node.js #arrays #postgresql #sql-insert #node-postgres

#node.js #массивы #postgresql #sql-вставка #узел-postgres

Вопрос:

Я пытаюсь написать запрос postgres (выполняемый в nodejs с использованием пула, созданного с использованием пакета node-postgres), который вставит новую строку в таблицу. Один из столбцов в этой таблице имеет тип text[] . Мой код выглядит следующим образом:

 pool.query('INSERT INTO paragraphs (lines) VALUES (ARRAY[$1]::TEXT[]) RETURNING id', [my_array], (err, results) => {
            if (err) {
              reject(err)
              return;
            }
            
            resolve(results.rows[0].id)
})
  

paragraphs это имя моей таблицы и lines это имя столбца типа text[] . my_array это список строк. Моя проблема в том, что вставляется не массив строк, а скорее одна строка, отформатированная как array. e.x .:

{"["First line", "Second line", "Third Line"]"}

Я хочу, чтобы это было:

{"First line", "Second line", "Third Line"}

Я также попытался удалить части ARRAY и TEXT (так что sql выглядит как INSERT INTO paragraphs (lines) VALUES ($1) RETURNING id в приведенном выше запросе), но затем я получаю ошибки:

 malformed array literal: "["New First line", "Second line", "Third Line"]"
DETAIL:  "[" must introduce explicitly-specified array dimensions.
  

Каков правильный способ вставки списков строк в таблицы PostgreSQL в nodejs с помощью запроса, выполняемого пулом?

Ответ №1:

Согласно:https://node-postgres.com/features/queries#parameterized-query

Параметры, переданные в качестве второго аргумента в query(), будут преобразованы в необработанные типы данных с использованием следующих правил: …

Массив

Преобразовано в строку, описывающую массив Postgres. Каждый элемент массива рекурсивно преобразуется с использованием правил, описанных здесь.

Итак:

VALUES ($1) или VALUES ($1::TEXT[]) должно быть достаточно.

Комментарии:

1. Я изначально пробовал это. Оказывается, что массив, который я пытался использовать в качестве своего параметра, на самом деле был просто строкой (я использовал body-parser, который по какой-то причине не проанализировал массив в теле моего сообщения и оставил его в виде строки). Исправление этого и использование вашего метода сработало!