проблема knex где NotExists - PullRequest
0 голосов
/ 12 июля 2019

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

Спасибо!

app.post('/addcart', (req,res)=>{
  const{customer_id, product_id,item_quantity}=req.body;
  db('shopping_carts')
  .insert({
    customer_id:customer_id,
    product_id:product_id,
    item_quantity:item_quantity
  })
  .whereNotExists(db.select('*').from('shopping_carts').where('product_id',product_id))
  .then(item=>{
    console.log(item)
    res.json(item)
  })
  .catch((err)=>{
    if(err.column === 'customer_id'){
      res.status(400).json({message:err})
      console.log('test')
    }else{
      res.status(500).json({message:err})
      // console.log(err.name);
    }
  })
})

1 Ответ

1 голос
/ 12 июля 2019

Вы не можете объединить запрос whereNotExists с запросом вставки, они не поддерживают это из-за его сложности. Таким образом, knex игнорирует вызов whereNotExists после вставки в цепочку методов.

Сначала необходимо проверить существование, а затем выполнить вставку с помощью отдельных вызовов.

Вы также можете написать необработанный запрос. Вот пример, это не красиво: https://github.com/tgriesser/knex/commit/e74f43cfe57ab27b02250948f8706d16c5d821b8

Однако при попытке сделать это вы столкнетесь с проблемами параллелизма / блокировки. Вам гораздо лучше использовать уникальный ключ и позволить БД отклонить вставку. Тогда вы можете поймать это:

.catch((err) => {
  if (err.code === 23505) { res.status(500).json({message: 'duplicate'});
}

Редактировать, больше информации, если вам интересно. Здесь есть очень длинная тема: https://github.com/tgriesser/knex/issues/871

...