gpt4 book ai didi

node.js - 使用 pg-promise 跳过更新列

转载 作者:搜寻专家 更新时间:2023-11-01 00:39:19 25 4
gpt4 key购买 nike

我在 Node 上使用了用于 Postgres 的 pg-promise 的 API,这很好用,但我正在考虑如何修改 PUT 语句以更好地处理输入中的 NULLS。

PUT语句的代码如下:

    //UPDATE a single record
function updateRecord(req, res, next) {
db.none('update generic1 SET string1=$1,' +
'string2=$2,' +
'string3=$3,' +
'string4=$4,' +
'string5=$5,' +
'string6=$6,' +
'integer1=$7,' +
'integer2=$8,' +
'integer3=$9,' +
'date1=$10,' +
'date2=$11,' +
'date3=$12,' +
'currency1=$13,' +
'currency2=$14' +
'WHERE id = $15',
[req.body.string1,
req.body.string2,
req.body.string3,
req.body.string4,
req.body.string5,
req.body.string6,
parseInt(req.body.integer1),
parseInt(req.body.integer2),
parseInt(req.body.integer3),
req.body.date1,
req.body.date2,
req.body.date3,
parseInt(req.body.currency1),
parseInt(req.body.currency2),
parseInt(req.params.id)])
.then(function(){
res.status(200)
.json({
'status': 'success',
'message': 'updated one record'
});
})
.catch(function(err){
return next(err);
});
}

现在此语句有效,但如果我将 NULLS 传递给下一次更新,它也会删除现有值。例如,如果我只想更新 string1 和 date2,我必须发送整个 json 对象,否则所有其他值都将设置为 NULL。

有没有更好的方法来处理这个问题?我应该改用 PATCH 动词吗??

最佳答案

我是 pg-promise 的作者;)

const pgp = require('pg-promise')({
capSQL: true // capitalize all generated SQL
});

// generic way to skip NULL/undefined values for strings:
function str(col) {
return {
name: col,
skip: function () {
var val = this[col];
return val === null || val === undefined;
}
};
}

// generic way to skip NULL/undefined values for integers,
// while parsing the type correctly:
function int(col) {
return {
name: col,
skip: function () {
var val = this[col];
return val === null || val === undefined;
},
init: function () {
return parseInt(this[col]);
}
};
}

// Creating a reusable ColumnSet for all updates:
const csGeneric = new pgp.helpers.ColumnSet([
str('string1'), str('string2'), str('string3'), str('string4'), str('string5'),
str('string6'), int('integer1'), int('integer2'), int('integer3'),
str('date1'), str('date2'), str('date3')
], {table: 'generic1'});

// Your new request handler:
async function updateRecord(req, res, next) {

const update = pgp.helpers.update(req.body, csGeneric) + ' WHERE id = ' +
parseInt(req.params.id);

try {
await db.none(update);
res.status(200);
} catch(err) {
return next(err);
}
}

参见 helpers命名空间 ;)


或者,您可以对每一列进行自己的验证,然后相应地生成一个 UPDATE 查询,尽管它不会那么优雅;)

更新

请注意,initskip 的参数化方式在库的 5.4.0 版本中发生了变化,请参阅 the release notes .

从5.4.0版本开始,可以简化代码如下:

// generic way to skip NULL/undefined values for strings:
function str(column) {
return {
name: column,
skip: c => c.value === null || c.value === undefined
};
}

// generic way to skip NULL/undefined values for integers,
// while parsing the type correctly:
function int(column) {
return {
name: column,
skip: c => c.value === null || c.value === undefined,
init: c => +c.value
};
}

如果你想跳过根本没有传入的属性,因此甚至不存在于对象中,那么不要这样:

skip: c => c.value === null || c.value === undefined

你可以这样做:

skip: c => !c.exists

更新

库的版本 5.6.7 对此进行了进一步改进 - 选项 emptyUpdate,指定时表示方法返回的值,而不是抛出 Cannot generate an UPDATE没有任何列。参见 helpers.update了解详情。

另请参阅:ColumnConfig .

关于node.js - 使用 pg-promise 跳过更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40697330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com