用node-mysql,NodeJS和Q更新多行

我正在使用node-mysql,node-js和Q promise。

我已经成功更新,删除,并插入单行使用上述。 以及在我的testing用例场景中在单个语句中插入多行。

但是,我需要在单个查询或for循环中更新具有不同值(批处理模式)的多行。

关于如何在mysql2中使用预准备语句(应该在node-mysql上进行改进)的信息非常稀less,没有示例,尽pipe这应该是自然的select,同时还要承诺弥补node-jsasynchronous性。

另外,我在各种testing场景中成功地使用了defered.makeNodeResolver()。

我正在尝试更新多个行在一个单一的查询与where子句和改变条件。

当我更新单行时它正在工作。 但是,当我尝试用单个查询更新多行时,logging不会更新。

我准备切换到使用for循环来执行多个更新,然后汇总结果并将其从服务器发送回客户端,这将是我的第二个首选选项。 如果没有太多的performance,我不明白为什么不这样做。 但是我还没有find这样做的例子。

var values = [ { users: "tom", id: 101 }, { users: "george", id: 102 } ]; // var params = [values.users, values.id ]; var sql = 'UPDATE tabletest SET users = ? WHERE id = ?;'; connection.query(sql, [{users: values[0].users}, {id: values[0].id }], defered.makeNodeResolver()); 

上面显示的代码实际上并没有更新多行。 我想我的语法有一个错误。

但无论如何,在这个特定的场景中,最好的方法是什么? 准备好的语句,for循环中的重复查询或存储过程?

你可以这样做:

 var values = [ { users: "tom", id: 101 }, { users: "george", id: 102 } ]; var queries = ''; values.forEach(function (item) { queries += mysql.format("UPDATE tabletest SET users = ? WHERE id = ?; ", item); }); connection.query(queries, defered.makeNodeResolver()); 

要使用多个语句function,您必须为您的连接启用它:

 var connection = mysql.createConnection({ ... multipleStatements: true, }); 

我不认为你可以(至less很容易/有效地)以你尝试的方式更新多行。 你基本上必须循环你的values并为每个对象执行UPDATE。

这段代码是从node.js的vcl.js中获得的,它是用typescript编写的,并且在一个单独的事务中提供了一个多重更新,删除,更新logging。

 export class SQLStatment { sql: string; params: Object } var dbError: string; var execCount: number = 0; function DBexecuteBatchMYSQLSingle(connection: any, SQLStatmentArray: Array<SQLStatment>, index: number, callback: () => void) { execCount++; connection.query(SQLStatmentArray[index].sql, SQLStatmentArray[index].params, function (err, rows, fields) { if (err) dbError = err; if (index + 1 == SQLStatmentArray.length) callback(); else { if (!dbError) { DBexecuteBatchMYSQLSingle(connection, SQLStatmentArray, index + 1, function () { if (index == 0) callback(); }); } } }); } function DBBatchUpdateMYSQL(SQLStatmentArray: Array<SQLStatment>, callback?: (err) => void) { var mysql = require('mysql'); var connection = mysql.createConnection({ host: "host",user: "user",database: "db", port: 1022, password: "pass"}); dbError = null; execCount = 0; connection.beginTransaction(function (err) { if (err && callback) callback("Database error:" + err); else { DBexecuteBatchMYSQLSingle(connection, SQLStatmentArray, 0, () => { if (dbError) { connection.rollback(function () { if (callback) callback("Database error:" + dbError); }); } else { connection.commit(function (err) { if (callback) callback(null); }) } }); } }); } 

你可能应该采取以下的方式

 UPDATE DB.table SET table.row = newValue WHERE table.someColumn in ('columnVal1', 'columnVal2'); 

恩。

 UPDATE DB.Students SET result = "pass" WHERE rollNo in (21, 34, 50);