@VelkinVV

Node + pg. Как вставить множество строк в таблицу?

Подскажите, никак не могу вставить множество строк из объекта в базу.
Сервер на Node+express, для подключения к базе использую pg
Данные для примера.
const data = [
   { id: 1, status: 'ok', type: 'def',  time: '22:15' },
   { id: 2, status: 'error', type: 'error',  time: '22:15'  },
   { id: 3, status: 'ok', type: 'def',  time: '22:15'  },
]

await pool.query(
	`INSERT INTO public.orders(id, status, type, time) \
	VALUES ($1, $2, $3, $4) RETURNING *`,
	data.map((item) => [item.id, item.status, item.type, item.time])
)


Получаю ошибку bind message supplies 3 parameters, but prepared statement "" requires 4
Т.е. при переборе, он каждый массив считает как отдельный параметр, а не как набор параметров.

Отдельно отправлять запросы с каждой строкой не вариант, таких строк может быть несколько десятков тысяч, и положить сервер не хочется.
Как правильно писать множество данных в базу одним запросом?
  • Вопрос задан
  • 240 просмотров
Решения вопроса 2
Alexandroppolus
@Alexandroppolus
кодир
как-то так

await pool.query(
  `INSERT INTO public.orders(id, status, type, time) \
  SELECT unnest(array[%1]), unnest(array[%2]), unnest(array[%3]), unnest(array[%4])`,
  [
    data.map(item => item.id),
    data.map(item => item.status),
    data.map(item => item.type),
    data.map(item => item.time),
  ]
)
Ответ написан
@VelkinVV Автор вопроса
Проблема решена использованием библиотеки pg-format

Упрощённый пример ниже
const format = require('pg-format');

const data = [
   { id: 1, status: 'ok', type: 'def',  time: '22:15' },
   { id: 2, status: 'error', type: 'error',  time: '22:15'  },
   { id: 3, status: 'ok', type: 'def',  time: '22:15'  },
]

const queryData = data.map((item) => [item.id, item.status, item.type, item.time])
const query = format('INSERT INTO public.orders(id, status, type, time)  VALUES %L', queryData)
await pool.query(query)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы