Получение подставных данных postgres.js

Всем привет! Пытаюсь получить данные из таблицы Postgresql с помощью библиотеки postgres.js
Написал вот такой код(Он проверяет, есть ли в теле запроса то или иное значение и ищет столбцы в бд)

export const getQuantity = async (values: values) => {
    let v = undefined
    if(values.plu !== undefined && v === undefined){
        v = `plu=${values.plu}`
    }
    console.log(v)
    if(values.quantity_of_products_in_shop !== undefined && v === undefined){
        v = `quantity_of_products_in_shop=${values.quantity_of_products_in_shop}`
    }
    console.log(v)
    if(values.quantity_of_products_in_cart !== undefined && v === undefined){
        v = `quantity_of_products_in_cart=${values.quantity_of_products_in_cart}`
    }
    console.log(v)
    if(values.shop_id !== undefined && v === undefined){
        v = `shop_id=${values.shop_id}`
    }
    console.log(v)
    const response = await sql`
    SELECT 
        product_name,
        quantity_of_products_in_shop,
        quantity_of_products_in_cart
    FROM products
    WHERE ${sql(v)}
    `
    console.log(response)
    return response
}

Но единственным что я получаю из этого кода - ошибка. Уже убирал sql() - встроенная функция из доков к библиотеке, из последнего WHERE, но ничего не помогает

Вот текст ошибки:

PostgresError: столбец "shop_id=1234" не существует
    at ErrorResponse (D:\programming\work\test-programm\node_modules\postgres\cjs\src\connection.js:788:26)
    at handle (D:\programming\work\test-programm\node_modules\postgres\cjs\src\connection.js:474:6)
    at Socket.data (D:\programming\work\test-programm\node_modules\postgres\cjs\src\connection.js:315:9)
    at Socket.emit (node:events:513:28)
    at Socket.emit (node:domain:489:12)
    at addChunk (node:internal/streams/readable:315:12)
    at readableAddChunk (node:internal/streams/readable:289:9)
    at Socket.Readable.push (node:internal/streams/readable:228:10)
    at TCP.onStreamRead (node:internal/stream_base_commons:190:23)
    at cachedError (D:\programming\work\test-programm\node_modules\postgres\cjs\src\query.js:170:23)
    at new Query (D:\programming\work\test-programm\node_modules\postgres\cjs\src\query.js:36:24)
    at sql (D:\programming\work\test-programm\node_modules\postgres\cjs\src\index.js:112:11)
    at getQuantity (D:\programming\work\test-programm\src\services\shop.ts:96:31) {
  severity_local: 'ОШИБКА',
  severity: 'ERROR',
  code: '42703',
  position: '139',
  file: 'parse_relation.c',
  line: '3721',
  routine: 'errorMissingColumn'
}

Сказано, что столбец shop_id=1234 не существует, но если я выведу в консоль код запроса к базе и проверю его в pgAdmin4, то все сработает


Ответы (2 шт):

Автор решения: Owlly

вы передаете строку вида shop_id=1234 напрямую в SQL-запрос через sql(v), а Postgres ожидает конкретное выражение вроде shop_id = 1234

    // Строим запрос
    const response = await sql`
    SELECT 
        product_name,
        quantity_of_products_in_shop,
        quantity_of_products_in_cart
    FROM products
    ${conditions.length > 0 ? sql`WHERE ${sql.join(conditions, sql` AND `)}` : sql``}
    `;

    console.log(response);
    return response;
}
→ Ссылка
Автор решения: nörbörnën

Попробуйте так:

export const getQuantity = async (values: values) => {
  let v = sql`true`;

  if (values.plu !== undefined) {
    v = sql`plu=${values.plu}`;
  } else if (values.quantity_of_products_in_shop !== undefined) {
    v = sql`quantity_of_products_in_shop=${values.quantity_of_products_in_shop}`;
  } else if (values.quantity_of_products_in_cart !== undefined) {
    v = sql`quantity_of_products_in_cart=${values.quantity_of_products_in_cart}`;
  } else if (values.shop_id !== undefined) {
    v = sql`shop_id=${values.shop_id}`;
  }

  const response = await sql`
    SELECT 
        product_name,
        quantity_of_products_in_shop,
        quantity_of_products_in_cart
    FROM products
    WHERE ${v}
  `;
  console.log(response)
  return response
}
→ Ссылка