首页 > 解决方案 > 有没有一种方法可以更新 postgres 和节点 js 中的用户配置文件(详细信息),但每次都必须发送请求正文中的所有参数?

问题描述

我有一个这种格式的 postgres 查询: UPDATE farmer SET first_name=$1, last_name=$2, contact_no=$3, Cooperation_name=$4 WHERE verification_id=$5

但是,这将要求我在想要更新数据时发送请求正文中的所有参数,否则我将获得未包含参数的空值。

有没有办法可以在节点 js 或 postgres 或两者中编写它,这样我只在请求正文中包含我想更新的参数而不将其他值设置为 null。

这是我使用查询的服务

标签: javascriptmysqlnode.jspostgresqlexpress

解决方案


曾经遇到过类似的问题,我创建了一个函数来做到这一点。

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


它可能不适用于复杂的查询,但像您的示例中这样的简单语句应该可以正常工作。


推荐阅读