如何在express-cassandra中检查行是否删除成功?
判断Cassandra删除操作是否实际生效的方法
你遇到的问题是Cassandra数据库的特性导致的:Cassandra的DELETE操作是幂等的,无论目标数据是否存在,只要集群成功处理了请求,就会返回结构一致的ResultSet——它只确认操作被集群执行,不会告诉你有没有实际删除数据。
下面是两种可行的解决思路:
方案1:删除前先校验数据存在性
在执行删除前,先通过查询确认目标数据是否存在,以此判断后续删除操作是否实际生效:
// 先查询目标消息是否存在 const targetMessage = await models.instance.MessageStore.findOne(searchByQuery); if (targetMessage) { const deleteMessage = util.promisify(models.instance.MessageStore.delete).bind(models.instance.MessageStore); await deleteMessage(searchByQuery); console.log("成功删除消息"); return "Message Deleted"; } else { console.log("目标消息不存在,无需删除"); return "Message Not Found"; }
方案2:用轻量事务(LWT)做条件删除
借助Cassandra的轻量事务特性,给删除操作加上IF EXISTS条件,这样只有数据存在时才会执行删除,同时可以通过返回结果判断操作是否实际生效:
// 构建带IF EXISTS条件的删除查询 const conditionalDelete = models.instance.MessageStore.delete(searchByQuery).ifExists(); const executeDelete = util.promisify(conditionalDelete.exec).bind(conditionalDelete); const result = await executeDelete(); // 校验是否实际执行了删除(不同ORM/驱动版本可能略有差异) const deletionApplied = result.info?.applied || result.rows?.[0]?.['[applied]']; if (deletionApplied) { console.log("消息删除成功"); return "Message Deleted"; } else { console.log("消息不存在,未执行删除"); return "Message Not Found"; }
至于你尝试的after_delete钩子,它的触发逻辑是只要ORM发送了删除请求并收到集群的成功响应就会执行,和数据是否存在无关,所以没法用来判断删除是否实际生效。
内容的提问来源于stack exchange,提问作者Diganta Kr Banik
相关产品推荐
相关产品推荐

