2011-05-20 72 views
1

我正在編寫一些非web應用程序幫助程序,並且遇到了對同步查詢調用的需求。Node.js和node-mysql數據庫查詢 - 需要同步代碼幫助

基本上,在一個循環內,我需要檢查數據庫,看看值是否存在。如果沒有,則插入該值。目前,在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

作爲一個方面說明,不要像這樣形成您的查詢,因爲您將SQL注入可能性引入到您的應用程序中。請參閱http://stackoverflow.com/a/15779796/253594 – Vetsin 2013-07-10 03:10:28

回答

1

基本上,在循環中,我需要檢查數據庫,看看是否值存在。如果沒有,則插入該值。

這是SQL最好的一個問題。您不必通過反覆與數據庫交談來解決此問題,只需讓SQL僅插入索引值尚不存在的位置即可解決此問題。

INSERT INTO mytable (name, address) 
SELECT @name, @address FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM mytable WHERE name = @name, address = @address) 

這是一個超級簡化的例子,而不是最優化的。如果你喜歡,你可以用數據集來做同樣的事情,而不是按記錄記錄。

+0

我應該提到,如果您可以一次插入多條記錄,則可以通過構建臨時表和加入來更快地進行操作。 – jcolebrand 2011-05-20 13:28:57

+0

我對我的結局做了更多的研究,並且node-mysql的創建者聲明它不能同步。因此,我將SQL中的過濾器視爲最好的整體選項。我一定會嘗試一下臨時表。 隨着進一步的鬼混,我能夠「欺騙」節點js進入等待狀態。但是,我不會將這個解決方案用於需要極高速度的任何事情。我基本上在查詢回調中使用了一個EventEmitter,並讓父腳本等待這個調用。 – user761974 2011-05-22 22:54:16

1

基本上,在循環中,我需要 檢查數據庫,看看是否值 存在。如果不是,則插入 值。目前,使用node-mysql I 只能使它與 回調一起工作。因此,node.js 將該呼叫視爲異步,並且 在 查詢完成之前繼續處理我的請求。這是一個大問題 ,因爲最後它可能是 插入重複項,因爲它們是隊列中的 。

有一個異步解決方案,總是存在。

基本上你擔心可以輸入重複的條目。

我認爲你有一個數據循環通過。您的問題已通過_.uniq或其他一些過濾解決方案解決。

所以你只需撥打_.uniq(md5s).forEach(function() { })