PG-承诺不会删除,但不会引发错误或者

问题描述:

我有以下查询成功地删除记录,当我在psql的shell中运行它:PG-承诺不会删除,但不会引发错误或者

delete from schedule_set USING schedule, event WHERE (schedule.schedule_set_id = schedule_set.id) and (schedule_set.id = ${id}) and (select count(*) from event where (complete IS TRUE)) = 0 RETURNING * 

我生成一个查询JS功能 - 这就是为什么我有$ {ID}查询,比调用如下

return db.any(schedule.deleteSchedulesByScheduleSetId(params), params) 
     .catch(err => { 
      console.log(err); 
     }); 

当我在查询语法错误我得到一个错误 - 这告诉我,该查询是被跑针对数据库。当我修复语法时,我没有收到任何错误,但是没有任何内容被删除。

任何想法为什么或如何调试? - 谢谢

+0

所以你'WHERE'结果中删除什么。但它仍然是一个成功的操作。为什么你期望method [any](http://vitaly-t.github.io/pg-promise/Database.html#any)返回一个错误?它不应该。如果您希望该查询返回错误,则应使用method [many](http://vitaly-t.github.io/pg-promise/Database.html#many)。 –

+0

但它应该删除一些东西。当我用数字替换$ {id}并在psql shell中运行相同的查询时,它会按照我的预期删除4条记录。 – melis

方法any,如记录,只执行查询结果时拒绝错误。如果您的DELETE查询不删除任何内容,则不是错误。

如果要产生错误的DELETE查询时,它不会删除任何东西,你可以在查询的末尾使用RETURNING *,并且取决于它是多少条记录要么manyone,执行它预计会正常删除(并因此返回)。

然而,最实用的方法不是使用上述任何一种方法,因为返回删除的行是额外的操作,通常是无用的。相反,你应该依靠实际删除的行数,然后采取相应的行动。

对于您会使用方法result,输出转换成受影响的行数(在你的情况下删除):

db.result(query, values, a => a.rowCount) 
    .then(count => { 
     // count = number of rows deleted 
    }) 
    .catch(error => { 
     // error 
    }) 
+0

我相信这里有一个误解。我不期望它会抛出一个错误。我期待这个查询删除1条记录。我之所以说没有抛出错误就是为了强调数据库没有什么抱怨,所以我不知道在哪里寻找。我打电话给我的api删除这条记录,并且记录不会被删除 - 如果我进入运行psql的终端shell并运行相同的查询并用数字替换$ {id},而不是删除记录。当我用pg-promise发送它时,查询似乎不起作用。我有道理吗? – melis

+0

我实际上在db.result中找到了你的例子,并且之前用我替换了它,因为当没有任何东西被删除时我需要返回一个不同的状态码。 – melis

+1

@melis在查询格式中必须是错误的。最典型的是为'$ {id}'传递一个字符串,而不是一个整数。使用[pg-monitor](https://github.com/vitaly-t/pg-monitor)来查看真正正在执行的内容,或者至少是日志事件[query](http:// vitaly-t .github.io/PG-承诺/ global.html#事件:查询)。 –