Передать массив в запрос postgresql - nodejs

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

async function getFixtures() {
  let response;
  try {
    response = await pool.query("SELECT * FROM fixtures WHERE league_name IN ('Chinese Super League', 'Iran Pro League', 'English Premier League')");
  } catch (e) {
    console.error('Error Occurred', e);
  }
    return response.rows;
}

Когда я пытаюсь передать массив, но не получаю результатов

async function getFixtures(leaguesArray) {
  let response;
  try {
    response = await pool.query("SELECT * FROM fixtures WHERE league_name IN ($1)", [leaguesArray]);
  } catch (e) {
    console.error('Error Occurred', e);
  }
    return response.rows;
}

Когда я выхожу из системы, leaguesArray вернется

['Chinese Super League', 'Iran Pro League', 'English Premier League']

Поэтому, когда он передается в запрос, я думаю, что это

[['Chinese Super League', 'Iran Pro League', 'English Premier League']]

Нужно ли мне преобразовать этот исходный массив в строку?

Я явно что-то упускаю, но не знаю, что

Спасибо

Вы уверены, что ("SELECT * FROM fixtures WHERE league_name IN ($1)", [leaguesArray]) работает? Я имею в виду - вы уверены, что он заменит $ 1 на этот массив в запросе?

KarlR 30.08.2018 10:02

Взгляните на следующий GitHub FAQ, я думаю, он нацелен именно на вашу проблему.

Ramiz Wachtler 30.08.2018 10:20

Спасибо @RamizWachtler, все отсортировано, = ANY ($1)

Richlewis 30.08.2018 10:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
5 235
2

Ответы 2

Как упоминается в документы. Я считаю, что вы используете два подхода

Подход # 1

async function getFixtures(leaguesArray) {
let response;
  try {
    response = await pool.query("SELECT * FROM fixtures WHERE league_name = ANY ($1)", [leaguesArray]));
  } catch (e) {
    console.error('Error Occurred', e);
  }
return response.rows;
}

Подход # 2

async function getFixtures(leaguesArray) {
let response;
const offset = 1;
const placeholders = leagueArray.map(function(name,i) { 
    return '$'+(i+offset); 
}).join(',');
  try {
    response = await pool.query("SELECT * FROM fixtures WHERE league_name IN (" + placeholders+")", leaguesArray));
  } catch (e) {
    console.error('Error Occurred', e);
  }
return response.rows;
}

Подход №2 терпит неудачу, если длина placeholders равна 0. Получение WHERE league_name IN () бросает syntax error at or near ")".

Nikita 15.07.2021 10:42

У меня такая же проблема, и я решил ее с помощью пакета pg-формат.

Для WHERE IN вы можете использовать это так:

import format from 'pg-format';

response = await pool.query(format("SELECT * FROM fixtures WHERE league_name IN (%L)", leaguesArray));

Примечание: теперь pool.query принимает только один аргумент, а format принимает шаблон + переменные для генерации допустимого запроса SQL.

Другие вопросы по теме