#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, который по какой-то причине не проанализировал массив в теле моего сообщения и оставил его в виде строки). Исправление этого и использование вашего метода сработало!