【问题标题】:knex issue whereNotExistsknex 问题 whereNotExists
【发布时间】:2019-07-12 01:01:33
【问题描述】:

我在使用 PostgreSQL 的 Knex 路由时遇到了一些问题。我正在尝试插入数据库,但仅当该项目不在数据库中时。我正在尝试使用不存在的地方,但它似乎并没有按照我的意愿去做。我很感激你能给我的任何帮助。

谢谢!

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);
    }
  })
})

【问题讨论】:

  • 正确的解决方案是使product_id 唯一,这样数据库会拒绝插入
  • @slebetman 并没有真正回答问题
  • @Devnetics - 这就是为什么它是评论而不是答案。感谢您更新您的答案以包含它

标签: node.js reactjs express knex.js


【解决方案1】:

您不能将 whereNotExists 查询与插入查询结合使用,由于它的复杂性,它们不支持这一点(根据@mikael,大多数数据库不支持这一点)。所以 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

编辑:@mikael 关于数据库和插入位置的线程: https://github.com/tgriesser/knex/issues/871

【讨论】:

  • 这令人失望,但我想通了。替代品看起来很丑陋。谢谢!
  • 其实问题不在于 knex 不支持insert ... where,而是数据库不支持。 insert ... on conflict 是您正在寻找的数据库功能......遗憾的是 knex 也不支持。我还刚刚在github.com/tgriesser/knex/issues/871 中关闭了关于它的短线程,并带有指向正确功能的指针。
  • 感谢@mikael 的更正,更新我的答案。
猜你喜欢
  • 2019-08-12
  • 1970-01-01
  • 2018-09-08
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2018-07-11
相关资源
最近更新 更多