2014-10-29 204 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连接池将处理所有池,而且通常情况下,这些操作只会对您有用。

你会喜欢它,给它一试:)