簡體   English   中英

Node.js使用多層SQL

[英]Node.js Working with Multiple Tier SQL

我正在忙於使用Node.js修改舊程序,並且代碼無法同步執行時遇到了一些困難。

PostgreSQL表結構如下:

create table tier01 (
    t01_idno integer,
    t01_desc char(10)
);
insert into tier01 values
(1, 'Tier 01 A'),
(2, 'Tier 01 B');

create table tier02 (
    t02_t01_idno integer,
    t02_idno integer,
    t02_desc char(10)
);
insert into tier02 values
(1, 1, 'Tier 02 A'),
(1, 2, 'Tier 02 B'),
(2, 1, 'Tier 02 A');

create table tier03 (
    t03_t02_idno integer,
    t03_idno integer,
    t03_desc char(10)
);
insert into tier03 values
(1, 1, 'Tier 02 A'),
(1, 2, 'Tier 02 B'),
(2, 1, 'Tier 02 A');

我要代表的本質上是

select t01_desc, t02_desc, t03_desc
from tier01, tier02, tier03
where t01_idno = t02_t01_idno
and t02_idno = t03_t02_idno

但是結果不是顯示為

'Tier 01 A ','Tier 02 A ','Tier 03 A '
'Tier 01 A ','Tier 02 A ','Tier 03 B '
'Tier 01 A ','Tier 02 B ','Tier 03 A '
'Tier 01 B ','Tier 02 A ','Tier 03 A '
'Tier 01 B ','Tier 02 A ','Tier 03 B '

我正在努力

'Tier 01 A'
- - - 'Tier 02 A'
- - - - - - 'Tier 03 A'
- - - - - - 'Tier 03 B'
- - - 'Tier 02 B'
- - - - - - 'Tier 03 A'
'Tier 01 B'
- - - 'Tier 02 A'
- - - - - - 'Tier 03 A'
- - - - - - 'Tier 03 B'

我能夠用PHP做到的而沒有任何問題

////
// SQL
////

$lv_sql = " select * from tier01 " .
          " order by t01_idno ";
pg_prepare($lv_db, "tier01_cur", $lv_sql);

$lv_sql = " select * from tier02 " .
          " where t02_t01_idno = $1 " .
          " order by t02_idno ";
pg_prepare($lv_db, "tier02_cur", $lv_sql);

$lv_sql = " select * from tier03 " .
          " where t03_t02_idno = $1 " .
          " order by t03_idno ";
pg_prepare($lv_db, "tier03_cur", $lv_sql);

////
// Run
////

// LOOP THROUGH TIER01
$tier01_cur_query = pg_execute($lv_db, "tier01_cur", array());
while($tier01_cur = pg_fetch_row($tier01_cur_query)) {

   echo '<p>' . $tier01_cur[1] . '</p>';

   // LOOP THROUGH TIER02
   $tier02_cur_query = pg_execute($lv_db, "tier02_cur", array($tier01_cur[0]));
   while($tier02_cur = pg_fetch_row($tier02_cur_query)) {

      echo '<p> - - - ' . $tier02_cur[2] . '</p>';

      // LOOP THROUGH TIER03
      $tier03_cur_query = pg_execute($lv_db, "tier03_cur", array($tier02_cur[1]));
      while($tier03_cur = pg_fetch_row($tier03_cur_query)) {

         echo '<p> - - - - - - ' . $tier03_cur[2] . '</p>';

      }

   }

}

但由於查詢是異步執行的,因此我無法使用Node.js再現相同的結果。 我想我通過使用async和pg模塊已經非常接近(或者可能根本沒有接近),但是代碼看起來很混亂,而且仍然是錯誤的。

////
// SQL
////

lv_sql = " select * from tier01 " +
         " order by t01_idno ";
var tier01_cur = lv_sql;

lv_sql = " select * from tier02 " +
         " where t02_t01_idno = $1 " +
         " order by t02_idno ";
var tier02_cur = lv_sql;

lv_sql = " select * from tier03 " +
         " where t03_t02_idno = $1 " +
         " order by t03_idno ";
var tier03_cur = lv_sql;

////
// Run
////

gv_async.series ([
function(series) {

   ////
   // CONNECT TO DATABASE
   ////

   lv_pgsql = l_database.client();

   lv_pgsql.connect();

   series();

},

function(series) {

   // QUERY TIER01
   lv_pgsql.query(tier01_cur, [], function(err, res) {

      // LOOP THROUGH TIER01
      gv_async.forEachOf(res.rows, function(data, cnt, callbacktier01) {

         console.log(res.rows[cnt].t01_desc);

         // QUERY TIER02
         lv_pgsql.query(tier02_cur, [res.rows[cnt].t01_idno], function(err, res) {

            // LOOP THROUGH TIER02
            gv_async.forEachOf(res.rows, function(data, cnt, callbacktier02) {

               console.log(" - - - " + res.rows[cnt].t02_desc);

               // QUERY TIER03
               lv_pgsql.query(tier03_cur, [res.rows[cnt].t02_idno], function(err, res) {

                  // LOOP THROUGH TIER03
                  gv_async.forEachOf(res.rows, function(data, cnt, callbacktier03) {

                     console.log(" - - - - - - " + res.rows[cnt].t03_desc);
                     callbacktier03();

                  }, function(err, res) {
                     callbacktier02();
                  });

               });

            }, function(err, res) {
               callbacktier01();
            });

         });

      }, function(err, res) {
         series();
      });

   });

},
function(series) {

   ////
   // DISCONNECT DATABASE
   ////

   lv_pgsql.end();

   series();

   // BEING CALLED WITH AJAX SO
   // MUST SEND A RESPONSE
   res.send(null);

}
]);

Node.js代碼為我提供以下輸出

Tier 01 A
Tier 01 B
 - - - Tier 02 A
 - - - Tier 02 B
 - - - Tier 02 A
 - - - - - - Tier 03 A
 - - - - - - Tier 03 B
 - - - - - - Tier 03 A
 - - - - - - Tier 03 A
 - - - - - - Tier 03 B

我在嘗試重新創建用於同步使用的代碼時遇到問題,盡管我不知道像這樣的正確的Node.js程序流程方法,任何建議將不勝感激

我相信我已經找到了解決方案,當使用內置的async and await(可從Node Version 7.6.0獲得)而不是npm async模塊完成時,它似乎可以工作。

這看起來也更加整潔和快捷,這很棒。

f_retrievedata(function() {
   res.send(null);
});

async function f_retrievedata(callback) {

    var lv_sql = "";

    lv_sql = " select * from tier01 " +
             " order by t01_idno ";
    var tier01_cur = lv_sql;

    lv_sql = " select * from tier02 " +
             " where t02_t01_idno = $1 " +
             " order by t02_idno ";
    var tier02_cur = lv_sql;

    lv_sql = " select * from tier03 " +
             " where t03_t02_idno = $1 " +
             " order by t03_idno ";
    var tier03_cur = lv_sql;

    var lr_tier01 = "";
    var lr_tier02 = "";
    var lr_tier03 = "";

    lv_pgsql = l_database.client();
    await lv_pgsql.connect();

    // LOOP THROUGH TIER01
    lr_tier01 = await lv_pgsql.query(tier01_cur, []);
    lr_tier01 = await lr_tier01.rows;
    for(cnt1 = 0; cnt1 < lr_tier01.length; cnt1 ++) {

            console.log(lr_tier01[cnt1].t01_desc);

            // LOOP THROUGH TIER02
            lr_tier02 = await lv_pgsql.query(tier02_cur, [lr_tier01[cnt1].t01_idno]);
            lr_tier02 = await lr_tier02.rows;
            for(cnt2 = 0; cnt2 < lr_tier02.length; cnt2 ++) {

                    console.log( " - - - " + lr_tier02[cnt2].t02_desc);

                    // LOOP THROUGH TIER03
                    lr_tier03 = await lv_pgsql.query(tier03_cur, [lr_tier02[cnt2].t02_idno]);
                    lr_tier03 = await lr_tier03.rows;
                    for(cnt3 = 0; cnt3 < lr_tier03.length; cnt3 ++) {

                            console.log( " - - - - - - " + lr_tier03[cnt3].t03_desc);

                    }

            }

    }

    callback();

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM