【发布时间】:2014-10-22 12:16:34
【问题描述】:
我正在使用 node-mysql、node-js 和 Q Promise。
我已使用上述方法成功更新、删除和插入单行。以及在我的测试用例场景中的单个语句中插入多行。
但是,我需要在单个查询或 for 循环中使用不同的值(批处理模式)更新多行。
关于如何在 mysql2 中使用准备好的语句(应该在 node-mysql 上改进)的信息非常稀少,没有示例,尽管这应该是自然的选择,以及补偿 node-js 异步性质的承诺.
另外,我已经在各种测试场景中成功使用了defered.makeNodeResolver()。
我正在尝试使用 where 子句和更改条件更新单个查询中的多行。
当我更新一行时它正在工作。但是,当我尝试使用单个查询更新多行时,记录不会更新。
我准备切换到使用 for 循环来执行多个更新,然后聚合结果并将其从服务器发送回客户端,这将是我的第二个首选。如果没有太多的性能影响,我不明白为什么不应该这样做。但我还没有找到任何这样做的例子。
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 循环中的重复查询还是存储过程?
【问题讨论】:
-
您是否尝试仅使用
[values[0].users,values[0].id]作为query()的第二个参数? -
你是对的。我发现了一个语法错误。谢谢。我更改为以下内容: var sql = 'UPDATE tabletest SET ?在哪里 ?;';和 var query = connection.query(sql, [{users: values[0].users}, {id: values[0].id }], defered.makeNodeResolver());但它仍然只更新一行,而不是两者。它不应该循环遍历值对象吗?
-
我不确定这是否适用于 UPDATE,但它可能适用于 INSERT。
-
显然它只会更新第一行。我想知道最好的方法是什么? for 循环、准备好的语句或存储过程,另一种选择?肯定有人已经解决了这个问题。
-
@KisLeye 您是否找到了一种有效的方法?循环遍历并为每个对象发送单独的查询听起来不像是正确的方法,因为这里的大多数人都说调用堆栈最多可以达到 10k 条记录。
标签: node.js angularjs promise node-mysql