Передать имя столбца в качестве аргумента - Postgres и Node JS - PullRequest
0 голосов
/ 11 июня 2018

У меня есть запрос (оператор Update), обернутый в функцию, и мне нужно будет выполнить один и тот же оператор для нескольких столбцов в течение моего сценария

async function update_percentage_value(value, id){
  (async () => {
    const client = await pool.connect();
    try {
      const res = await client.query('UPDATE fixtures SET column_1_percentage = ($1) WHERE id = ($2) RETURNING *', [value, id]);
    } finally {
      client.release();
    }
  })().catch(e => console.log(e.stack))
}

Затем я вызываю эту функцию

update_percentage_value(50, 2);

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

Моя таблица выглядит следующим образом

CREATE TABLE fixtures (
  ID SERIAL PRIMARY KEY,
  home_team VARCHAR,
  away_team VARCHAR,
  column_1_percentage INTEGER,
  column_2_percentage INTEGER,
  column_3_percentage INTEGER,
  column_4_percentage INTEGER
);

Возможно ли вообще это сделать?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Чтобы получить имена столбцов таблицы, вы можете запросить таблицу information_schema.columns, в которой хранятся сведения о структуре столбцов вашей таблицы, это поможет вам создать динамический запрос для обновления определенного столбца на основе определенного результата..

Имена столбцов таблицы можно получить с помощью следующего запроса:

select column_name from information_schema.columns where table_name='fixtures' and table_schema='public';

Приведенный выше запрос даст вам список столбцов в таблице.

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

0 голосов
/ 12 июня 2018

Я собираюсь опубликовать решение, которое посоветовал Sehrope Sarkuni через репозиторий node-postgres GitHub.Это мне очень помогло и работает для того, что мне нужно:

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

Возможно, но вы должны построить текст SQL с именами столбцов.Если вы собираетесь динамически создавать SQL, вам следует избегать компонентов, использующих что-то вроде pg-формата, или использовать ORM, который обрабатывает такие вещи.

Так что-то вроде:

const format = require('pg-format');

async function updateFixtures(id, column, value) {
  const sql = format('UPDATE fixtures SET %I = $1 WHERE id = $2', column);
  await pool.query(sql, [value, id]);
}

Кроме того, если вы выполняете несколько обновлений одной и той же строки подряд, то вам, вероятно, лучше использовать один оператор UPDATE, который изменяет все столбцы, а не отдельные операторы, поскольку они будут и медленнее, и генерироватьбольше WAL на сервере.

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