2014-10-29 198 views
0

這個問題主要是關於在nodejs中編寫查詢的最佳實踐。我們提到了幾個教程,但無法得出結論。在nodejs中編寫SQL查詢

我們有一個節點js API層,主要用於讀寫數據庫。下面是一個示例代碼:

pool.query("update node SET changed = " + params.updationTime + " where nid = " + params.nid); 
pool.query("update node_revision SET timestamp = " + params.updationTime +" where nid = " + params.nid); 
pool.end(); 

難道這編寫代碼以正確的方式還是應該寫在異步格式本身的SQL查詢。

+0

Btw。沒有異步調用意味着查詢**不會同時執行。 – Shomz 2014-10-29 10:43:26

+0

不,這與通話中回調無關 – 2014-10-29 11:01:54

回答

0

如果您的池配置允許多個連接,那麼可能兩個查詢都是並行執行的。通話類型本身並不重要。本實施例中需要2秒完成:

connection.query('select sleep(1)'); 
connection.query('select sleep(1)', function() { console.log('done!') }); 

除了這一個:

connection.query('select sleep(1)', function() { 
    connection.query('select sleep(1)', function() { 
    console.log('done!') 
    }); 
    }); 

因爲MySQL協議本身是「順序」(即,客戶端僅允許結果之後發送下一個查詢之前已完全收到)。大多數異步客戶端通過在內部排隊命令來隱藏此限制。在兩個連接的情況下,查詢實際上去並聯:

connection1.query('select sleep(1)', function() { console.log('done1') }); 
connection2.query('select sleep(1)', function() { console.log('done2') }); 

「DONE1」和「done2」都將在大約1秒

pool.query在屏幕上出現爲pool.getConnection() + connection.query()一個shorlcut + connection.release() - 請參閱readme

+0

哪一種是最適合寫作查詢的方式(最佳做法)。 第一種方法或第二種方法?在我們的代碼中,目前我們正在使用第一種方法。 – ktrev 2014-10-30 10:46:10

+0

如果查詢不相關 - 第一種方法(但仍然帶有錯誤處理)。如果相關 - 第二個 – 2014-10-30 11:43:27

0

在NodeJS中編寫SQL查詢時,我無法提升Knex.js足夠多!

  • 構建動態查詢的程序化方式。(編寫動態原始SQL字符串是一個非常手動的過程)
  • 連接池。
  • 交易支持。
  • 字符串轉義。
  • 而且。

對於您的具體問題,您只需進行查詢並執行它們(使用回調或承諾),Knex連接池將處理所有池,而且通常情況下,這些操作只會對您有用。

你會喜歡它,給它一試:)