如何通过在node.js-sql中绑定参数来构builddynamic查询?

我最近使用nodejs-mysql模块在node.js中进行查询,在我的工作情况下,我只能使用参数绑定语法:

 SELECT * FROM table WHERE name = ? 

现在我想用这些构builddynamic的sql ??? 参数。 假设我有两个条件( nameage ),它们中的任何一个都可以为null(如果用户不提供),所以我想在三种情况下构buildMySQL:

  1. 只有name=BobSELECT * FROM table WHERE name = 'Bob'
  2. 只有age=40SELECT * FROM table WHERE age > 40
  3. 两者: SELECT * FROM table WHERE name = 'Bob' AND age > 40

我知道这很容易,如果你自己build立的查询,但我怎样才能实现它使用只能绑定字段或值的占位符?

nodejs-mysql文件中,占位符? 只代表价值和?? 代表田野:

  • https://github.com/felixge/node-mysql/#escaping-query-values
  • https://github.com/felixge/node-mysql/#escaping-query-identifiers

我首先想到的解决scheme是通过使用这些占位符插入查询片断,但它是因为两者都失败??? 将逃避我的查询片断,我的查询将被错误地执行。

我的代码到目前为止,如下,我敢肯定这是不正确的,因为查询件已经逃脱:

 // achieve paramters from url request var condition = {}; if(params.name)condition["name"] = ["LIKE", "%" + params.name + "%"]; if(params.age)condition["age"] = parseInt(params.age, 10); //build query var sqlPiece = buildQuery(condition); //try to replace ? with query var sql = 'SELECT * FROM table WHERE ?'; connection.query(sql, sqlPiece, function(err, results) { // do things }); // my own query build function to proceed conditions function buildQuery(condition) { var conditionArray = []; for(var field in condition){ var con = condition[field]; if(con !== undefined){ field = arguments[1] ? arguments[1] + "." + field : field; var subCondition; if(con instanceof Array) { subCondition = field + " " + con[0] + " " + wrapString(con[1]); }else{ subCondition = field + " = " + wrapString(con); } conditionArray.push(subCondition); } } return conditionArray.length > 0 ? conditionArray.join(" AND ") : "1"; } //wrap string value function wrapString(value){ return typeof value === "string" ? "'" + value + "'" : value; } 

那么有什么办法可以解决这个问题吗?

更新

感谢乔丹的提议,它的工作,但:

我知道通过stringconcat构build查询是非常好的,但在我的情况下,我不能使用,因为我使用一些中间件或处理MySQL和控制器,所以我可以做的是定义接口 ,这是一个SQLstring与占位符。 所以,接口string是以前定义的,我不能在我的控制器function中修改它。

你开始的时候是一个很好的开始,但是你可能已经过时了一点。 诀窍是用占位符( ? )作为一个stringbuild立一个查询,同时build立一个值的数组。

所以,如果你有params = { name: 'foo', age: 40 } ,你想要build立下列对象:

 where = 'name LIKE ? AND age = ?'; values = [ '%foo%', 40 ]; 

如果你只有{ name: 'foo' } ,你会build立这些:

 where = 'name LIKE ?'; values = [ '%foo%' ]; 

无论哪种方式,您可以直接在query方法中使用这些对象,即:

 var sql = 'SELECT * FROM table WHERE ' + where; connection.query(sql, values, function...); 

那么我们如何构build这些对象呢? 实际上,代码和buildQuery函数非常相似,但是并不复杂。

 function buildConditions(params) { var conditions = []; var values = []; var conditionsStr; if (typeof params.name !== 'undefined') { conditions.push("name LIKE ?"); values.push("%" + params.name + "%"); } if (typeof params.age !== 'undefined') { conditions.push("age = ?"); values.push(parseInt(params.age)); } return { where: conditions.length ? conditions.join(' AND ') : '1', values: values }; } var conditions = buildConditions(params); var sql = 'SELECT * FROM table WHERE ' + conditions.where; connection.query(sql, conditions.values, function(err, results) { // do things });