Использование bodyparser для создания обновления Postgres на нескольких строках - PullRequest
0 голосов
/ 20 февраля 2019

Приложение, созданное с помощью Express и Postgres.

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

const sqlProdOrder = 'UPDATE product_index SET product_ordered = $2 WHERE product_id = $1';

Однако сейчас я пытаюсь обновить несколько строк одновременно с разными данными.Я видел предыдущий вопрос и пришел к такому выводу, но все еще получаю ошибку запроса:

const sqlProdOrder = "WITH sample (product_id, product_ordered) AS ( SELECT * FROM unnest(ARRAY['$2'], ARRAY['$1'])) UPDATE product_index SET product_ordered = s.ordered FROM sample s WHERE product_id = s.id";

Вот сообщение с выражением:

router.post('/order', auth.check.bind(auth), (req, res) => {
const paramsProdOrderId = [req.body.product_id, req.body.product_ordered];
db.query(sqlProdOrder, paramsProdOrderId).then((results) => {
    if (results.rowCount === 0) {
        res.redirect('/products');
        return;
    }
    res.redirect('/');
})

.catch((err) => {
    res.redirect('/error/404')
});

});

Конечно, используя оба запроса sqlProdOrder, я получаю отправку в /error/404.

Я записал в консоль данные body-parser и все прошло нормально,Я действительно, что второй пример sqlProdOrder будет работать.

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

1 Ответ

0 голосов
/ 20 февраля 2019

Используйте приведенный ниже код, короче говоря, используйте первый запрос sqlProdOrder, который является идеальным способом вызова запроса на обновление.

Цитата

РЕДАКТИРОВАТЬ: Iиспользовал ЛЮБОЙ за 1 доллар, так как это массив целых чисел.

router.post('/order', auth.check.bind(auth), (req, res) => {

  const { product_id, product_ordered } = req.body;

  db.query(
    'UPDATE product_index SET product_ordered = $2 WHERE product_id = ANY($1)',
    [product_id, product_ordered]
  )
    .then(results => {
      if (results.rowCount === 0) {
        res.redirect('/products');
        return;
      }
      res.redirect('/');
    })

    .catch(err => {
      res.redirect('/error/404');
    });
});
...