Когда-то назад столкнулся с подобной проблемой, и я создал для этого функцию.
const addComma = (len) => len > 1 ? ', ' : '';
/**
* @param {updateStmtObject} {table, fields, condition}
* @returns {string} query
*/
function createUpdateStatement(table, fields, condition){
let query = {
text: `UPDATE ${table} SET`,
values: []
}
Object.keys(fields).forEach(col => {
query.values.push(fields[col]);
query.text += `${addComma(query.values.length)} ${col} = $${query.values.length}`;
});
if (query.values.length > 0) {
if(condition){
const col = Object.keys(condition)[0];
query.values.push(condition[col]);
query.text += ` WHERE ${col} = $${query.values.length}`;
}
return query;
} else {
//No changes to be made
return null;
}
}
module.exports = {
createUpdateStatement
};
/**
* Update statement object
* @typedef {Object} updateStmtObject
* @property {string} table - Table to be updated
* @property {object} fields - An object of column_name:value pairs for the query
* @property {object} condition - column_name:value pair for update condition.
* Only single condition currently supported. Add other conditions manually.
*/
Просто скопируйте и вставьте его в файл util. js или как угодно, затем вы можете вызвать его так для динамического создания оператора UPDATE:
const { createUpdateStatement } = require('util.js');
const updateData = {first_name: 'Benz', last_name: 'Stevox'};
const query = createUpdateStatement('users', updateData, {verification_id: 5});
console.log(query);
/*
{
text: 'UPDATE users SET first_name = $1, last_name = $2 WHERE verification_id = $3',
values: [ 'Benz', 'Stevox', 5 ]
}
*/
Вероятно, он не выдержит сложных запросов, но простые операторы, как в вашем примере, должны сработать очень хорошо.