我正在编写一些非Web应用程序帮助程序,并且遇到了对同步查询调用的需求。
基本上,在循环中我需要检查数据库以查看该值是否存在。如果没有,则插入该值。目前,使用node-mysql,我只能使用它来处理回调。因此,node.js将调用视为异步,并在查询完成之前继续处理我的请求。这是一个大问题,因为最终它可能会插入重复项,因为它们在队列中。
理想的解决方案 - 不起作用。结果实际上是客户端的对象,我无法在其中找到实际结果。但这确实使它同步。
results = client.query('SELECT COUNT(md5) as md5Count FROM table WHERE md5 = "' + md5 + '"')
以下不起作用。 Node.js将其视为异步,而outerResult仍然是客户端的对象。
outerResult = client.query('SELECT COUNT(md5) as md5Count FROM board WHERE md5 = "' + md5 + '"', function selectCb(err, results, fields) {console.log(results);});
感谢任何帮助。
答案 0 :(得分:1)
基本上,我需要一个循环 检查数据库以查看值 存在。如果没有,则插入 值。目前,用node-mysql我 只能让它与...一起工作 打回来。因此,node.js 将调用视为异步和 继续处理我的请求 查询完成。这是一个大问题 因为最终它可能是 插入重复项,因为它们是 在队列中。
有一个异步解决方案,总有。
基本上你担心可以输入重复的条目。
我认为你有一个循环的数据数组。使用_.uniq
或其他一些过滤器解决方案解决了您的问题。
所以你只需致电_.uniq(md5s).forEach(function() { })
答案 1 :(得分:1)
基本上,在循环中我需要检查数据库以查看该值是否存在。如果没有,则插入该值。
这是SQL最好的问题。您没有通过反复与数据库通信来解决此问题,您只需在索引值尚不存在的情况下插入SQL即可解决此问题。
INSERT INTO mytable ( name, address )
SELECT @name, @address FROM DUAL
WHERE NOT EXISTS (SELECT * FROM mytable WHERE name = @name, address = @address)
这是一个超级简化的示例,而不是最优化的示例。如果你愿意的话,你可以在这里用数据集做同样的事情,而不是逐个记录。