Есть ли способ, которым я могу обновить профиль пользователя (детали) в postgres и node js без необходимости каждый раз посылать все параметры в теле запроса? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть запрос postgres в этом формате: ОБНОВЛЕНИЕ фермеров SET first_name = $ 1, last_name = $ 2, contact_no = $ 3, кооперативное_имение = $ 4, ГДЕ validation_id = $ 5

Однако для этого потребуется отправить мне все для параметров в теле запроса всякий раз, когда я хочу обновить данные, иначе я получу нулевое значение для параметра, который не включен.

Есть ли способ, которым я могу написать это либо в node js, либо postgres или то и другое так, чтобы я включал только те параметры, которые я хочу обновить, в теле запроса, не устанавливая для других значений значение NULL.

это мои службы, в которых я нахожусь используя запрос

1 Ответ

0 голосов
/ 18 апреля 2020

Когда-то назад столкнулся с подобной проблемой, и я создал для этого функцию.

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 ]
}
*/


Вероятно, он не выдержит сложных запросов, но простые операторы, как в вашем примере, должны сработать очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...