Узел Postgres вставляет несколько строк на основе массива и переменной stati c - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь вставить несколько строк в сервер PostgresSQL с моего сервера Nodejs на основе массива. У меня есть переменная stati c user_id, которая будет одинаковой для всех записей, но я хочу изменить имя_фильтра на основе массива. Моя цель - не делать несколько вызовов SQL.

arrayOfFilters = ["CM", "CBO", "SA", "EPS", "AD"]

await db.query(
            "INSERT INTO filters(filter_name, requests_id)VALUES($1, $2)",
            [arrayOfFiltersParams, user_id]);

Я надеюсь, что в таблице фильтров будет строка для каждого из фильтров, найденных в arrayOfFilters, с соответствующим ключом user_id для каждой записи (или 5 строк в этом примере). Большое спасибо!

1 Ответ

0 голосов
/ 16 апреля 2020

Напишите вспомогательную функцию expand для построения Параметризованный запрос . Вот решение:

import { pgclient } from '../../db';

function expand(rowCount, columnCount, startAt = 1) {
  var index = startAt;
  return Array(rowCount)
    .fill(0)
    .map(
      (v) =>
        `(${Array(columnCount)
          .fill(0)
          .map((v) => `$${index++}`)
          .join(', ')})`,
    )
    .join(', ');
}
function flatten(arr) {
  var newArr: any[] = [];
  arr.forEach((v) => v.forEach((p) => newArr.push(p)));
  return newArr;
}

(async function test() {
  try {
    await pgclient.connect();
    // create table
    await pgclient.query(`
      CREATE TABLE IF NOT EXISTS filters (
        id serial PRIMARY KEY,
        filter_name VARCHAR(10),
        requests_id INTEGER
      )
    `);
    // test
    const arrayOfFilters = ['CM', 'CBO', 'SA', 'EPS', 'AD'];
    const user_id = 1;
    const arrayOfFiltersParams: any[] = arrayOfFilters.map((el) => [el, user_id]);
    await pgclient.query(
      `INSERT INTO filters(filter_name, requests_id) VALUES ${expand(arrayOfFilters.length, 2)}`,
      flatten(arrayOfFiltersParams),
    );
  } catch (error) {
    console.log(error);
  } finally {
    pgclient.end();
  }
})();

После выполнения вышеуказанного кода, проверьте базу данных:

node-sequelize-examples=# select * from "filters";
 id | filter_name | requests_id
----+-------------+-------------
  1 | CM          |           1
  2 | CBO         |           1
  3 | SA          |           1
  4 | EPS         |           1
  5 | AD          |           1
(5 rows)
...