2014-02-13 24 views
4

我使用了极好的插件node-postgres,https://github.com/brianc/node-postgres用node-postgres更新数据的更简单的方法是什么?

我有这个更新休息调用。我的桌子上有大约30列。有没有更简单的方法来更新这些呢?

/* 
Post /api/project/products/:pr_id HTTP/1.1 
*/ 
exports.updateProduct = function(req, res){ 
    pg.connect(cs, function(err, client, done) { 
    var query = "UPDATE products SET pr_title = ($1), pr_usercode = ($2) WHERE pr_id=($3)"; 
    client.query(query, [req.body.pr_title, req.body.pr_usercode, req.params.pr_id], function(err, result) { 
     if (handleErr(err, done)) return; 
     done(); 
     sendResponse(res, result.rows[0]); 
    }) 
    }); 
}; 

我在这里只有三列。当我编写全部30列时,这将是混乱和难以维护。必须通过简单的一行来更新req.body中的所有列?

任何想法?

回答

7

你总是可以推出一个功能,像这样:

function updateProductByID (id, cols) { 
    // Setup static beginning of query 
    var query = ['UPDATE products']; 
    query.push('SET'); 

    // Create another array storing each set command 
    // and assigning a number value for parameterized query 
    var set = []; 
    Object.keys(cols).forEach(function (key, i) { 
    set.push(key + ' = ($' + (i + 1) + ')'); 
    }); 
    query.push(set.join(', ')); 

    // Add the WHERE statement to look up by id 
    query.push('WHERE pr_id = ' + id); 

    // Return a complete query string 
    return query.join(' '); 
} 

,然后用它作为这样的:

/* 
Post /api/project/products/:pr_id HTTP/1.1 
*/ 
exports.updateProduct = function(req, res){ 
    pg.connect(cs, function(err, client, done) { 

    // Setup the query 
    var query = updateProductByID(req.params.pr_id, req.body); 

    // Turn req.body into an array of values 
    var colValues = Object.keys(req.body).map(function (key) { 
     return req.body[key]; 
    }); 

    client.query(query, colValues, function(err, result) { 
     if (handleErr(err, done)) return; 
     done(); 
     sendResponse(res, result.rows[0]); 
    }); 
    }); 
}; 

或者,如果一个ORM是你需要的,因为你会做什么很多像上面,你应该检查出像Knex.js模块

+0

请记住,'id'在'updateProductByID'应改为一个参数值。使用'i + 2'代替'i + 1',然后将产品ID值不转换为'colValues',以确保不会通过插入恶意标识来执行SQL注入。 – dimiguel

+0

filter函数返回布尔表达式,而不是值。你应该用'map'替换'filter',这是正确的函数返回值 –

+0

@NirO。良好的捕获 - 这是写成伪代码,并没有实际执行。将更新。 – srquinn

2

我喜欢使用knexjs,它适用于Postgre。这也是一种有趣的JavaScript编写查询方式(没有所有令人讨厌的SQL字符串操作)。

以拿出一些联系信息为例。该联系信息的JSON模式在其他地方定义(我在验证时也很有用)。其结果是一个代码生成的查询,其中只包含传入列。

function saveContactInfo(inputs, callback) { 
    var setObj = {}; 
    for(var property in inputs.contact) 
    { 
    //assumes properties are same as DB columns, otherwise need to use some string-mapping lookup. 
    setObj[ property ] = inputs.contact[property]; 
    } 
    setObj[ "LastModified" ] = new Date(); 

    var query = knex("tblContact").update(setObj).where("contactId", inputs.contact.contactId); 
    //log.debug("contactDao.saveContactInfo: " + query.toString()); 
    query.exec(function(err, results){ 
    if(err) return callback(err); 
    //Return from DB is usually an array, so return the object, not the array. 
    callback(null, results[0]); 
    });  
} 

Knexjs也有一些漂亮的唯一postgre选项(这将是有益的我,如果我没有使用MySQL)

+0

很好的答案。由于他的解决方案没有插件,我批准了另一个。但我一定会试用knexjs。似乎很方便Thx! – Per

0

创建插入查询

exports.createInsertQuery = (tablename, obj) => { 
    let insert = 'insert into ' + tablename; 
    let keys = Object.keys(obj); 
    let dollar = keys.map(function (item, idx) { return '$' + (idx + 1); }); 
    let values = Object.keys(obj).map(function (k) { return obj[k]; }); 
    return { 
     query: insert + '(' + keys + ')' + ' values(' + dollar + ')', 
     params: values 
    } 
} 

使用

let data = {firstname : 'hie' , lastname : 'jack', age : 4} 
let yo = createInsertQuery('user',data) 

client.query(yo.query, yo.params ,(err,res) =>{ 
console.log(res) 
}) 

所以喜欢聪明人,你可以创建更新删除查询

相关问题