如何使用pg
我有
db.result('DELETE FROM categories WHERE id = ${id}', category).then(function (data) { ...
和
db.many('SELECT * FROM categories').then(function (data) { ...
最初删除是从一个API调用调用,然后在以下API调用上选择,但db请求的回调以相反的顺序发生,因此我获得了已删除类别的类别列表。
有没有办法如何用pg-promise锁定类别表?
回答如下:如果你想要SELECT
的结果总是反映以前的DELETE
的结果,那么你有两种方法可以考虑......
标准方法是将操作统一为一个,因此您最终会针对同一连接执行所有相关查询:
db.task(function * (t) {
yield t.none('DELETE FROM categories WHERE id = ${id}', category);
return yield t.any('SELECT FROM categories');
})
.then(data => {
// data = only the categories that weren't deleted
});
当然,您也可以使用标准的promise语法甚至ES7 await/async
。
第二种方法是在你的服务中组织一个人工锁,这将阻止执行任何相应的SELECT
,直到DELETE
请求全部完成。
然而,这是一个非常尴尬的解决方案,通常指向架构中的缺陷。另外,作为pg-promise的作者,我甚至不会进入该解决方案,因为它无论如何都会超出我的库。
如何使用pg
我有
db.result('DELETE FROM categories WHERE id = ${id}', category).then(function (data) { ...
和
db.many('SELECT * FROM categories').then(function (data) { ...
最初删除是从一个API调用调用,然后在以下API调用上选择,但db请求的回调以相反的顺序发生,因此我获得了已删除类别的类别列表。
有没有办法如何用pg-promise锁定类别表?
回答如下:如果你想要SELECT
的结果总是反映以前的DELETE
的结果,那么你有两种方法可以考虑......
标准方法是将操作统一为一个,因此您最终会针对同一连接执行所有相关查询:
db.task(function * (t) {
yield t.none('DELETE FROM categories WHERE id = ${id}', category);
return yield t.any('SELECT FROM categories');
})
.then(data => {
// data = only the categories that weren't deleted
});
当然,您也可以使用标准的promise语法甚至ES7 await/async
。
第二种方法是在你的服务中组织一个人工锁,这将阻止执行任何相应的SELECT
,直到DELETE
请求全部完成。
然而,这是一个非常尴尬的解决方案,通常指向架构中的缺陷。另外,作为pg-promise的作者,我甚至不会进入该解决方案,因为它无论如何都会超出我的库。