I've got an API up on node using pg-promise for Postgres, this works well but i'm thinking about how to modify the PUT statement to handle NULLS in the input a little better.
The following is the code for the PUT statement:
//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);
});
}
Now this statement works, but it also removes existing values if I pass in NULLS to the next update. For example, if I wanted to just update string1 and date2 for example, i'd have to send the entire json object or all the other values are being set to NULL.
Is there a better way to handle this? Should I be using the PATCH verb instead??
I am the author of pg-promise ;)
See the helpers namespace ;)
Alternatively, you can do your own verification for each column, and then generate an
UPDATE
query accordingly, though it won't be as elegant ;)UPDATE
Please note that the way
init
andskip
are parameterized changed in version 5.4.0 of the library, see the release notes.Starting from version 5.4.0, you can simplify the code as this:
And if you want to skip the properties that were not passed in at all, and thus do not even exist within the object, then instead of this:
you can do this:
UPDATE
Version 5.6.7 of the library received a further improvement for this - option
emptyUpdate
, which when specified represents the value to be returned by the method, rather than throwingCannot generate an UPDATE without any columns
. See helpers.update for details.See also: ColumnConfig.
Alternative solution:
Thank you @vitaly-t! faster and cleaner, always a good result :)
for reference, i've also included the insert statement using the helpers as described above as well.