2017-04-22 205 views
0

我想用Knex運行PostgreSQL查詢,然後使用結果運行另一個查詢。對另一個SELECT查詢使用knex SELECT查詢結果

exports.buildBuoyFeaturesJSON = function (conditionA, conditionB) { 
var query = null; 

var selectedFields = knex.select 
(
    knex.raw('t_record.id AS id'), 
    ... 
    knex.raw('t_record.latitude AS latitude'), 
    knex.raw('t_record.longitude AS longitude') 
) 
    .from('t_record') 
    .then(function (response) { 
     var geometry_array = []; 
     var rows = response.rows; 
     var keys = []; 

     for (var key = 0; key <= rows.length - 1; key++) { 
      var geometry = 
       { 
        "id" : rows[key].id, 
        "type" : "Feature", 
        "geometry" : rows[key].geometry, 
        "properties" : { 
         ... 
         "sensors" : [] 
        } 
       }; 
      keys.push(rows[key].id); 
      geometry_array.push(geometry); 
     } 
     getMeasurementsAndSensors(keys, geometry_array); 
    }); 
}; 

後一個函數使用前面函數的一些結果。由於Knex的異步性,我需要從第一功能的。然後內部調用第二個函數()語句:

function getMeasurementsAndSensors (keys, geometry_array) { 
     var query = knex 
      .select 
      (
       't_record_id', 
       'i_sensor_id', 
       'description', 
       'i_measurement_id', 
       't_sensor_name', 
       't_measurement_name', 
       'value', 
       'units' 
      ) 
      .from('i_record') 
      ... 
      .whereRaw('i_record.t_record_id IN (' + keys + ')') 
      .orderByRaw('t_record_id, i_sensor_id ASC') 
      .then(function (response) { 

     var rows = response.rows; 
     var t_record_id = 0; 
     var i_sensor_id = 0; 
     var record_counter = -1; 
     var sensor_counter = -1; 

     for (var records = 0; records <= rows.length -1; records++) { 
      if (t_record_id !== rows[records].t_record_id) { 
       t_record_id = rows[records].t_record_id; 
       record_counter++; 
       sensor_counter = -1; 
      } 

      if (i_sensor_id !== rows[records].i_sensor_id) { 
       i_sensor_id = rows[records].i_sensor_id; 

       geometry_array[record_counter].properties.sensors[++sensor_counter] = 
       { 
        'i_sensor_id' : rows[records].i_sensor_id, 
        't_sensor_name' : rows[records].t_sensor_name, 
        'description' : rows[records].description, 
        'measurements' : [] 
       }; 
      } 

      geometry_array[record_counter].properties.sensors[sensor_counter].measurements.push 
      ({ 
        'i_measurement_id': rows[records].i_measurement_id, 
        'measurement_name': rows[records].t_measurement_name, 
        'value': rows[records].value, 
        'units': rows[records].units 
      }); 
     } 
     //wrapping features with metadata. 
     var feature_collection = GEOGRAPHY_METADATA; 
     feature_collection.features = geometry_array; 

     JSONToFile(feature_collection, 'buoy_features'); 
    }); 

}

目前我最終的結果保存到一個JSON文件,因爲我不能」沒有承諾工作。 JSON後來被用來爲一個小型的OpenLayers應用程序提供動力,因此在得到結果後進行JSON化。

我很確定從數據庫獲取數據,將其保存到文件,然後從另一個進程訪問它並將其用於OpenLayers是一種非常冗餘的方式,但迄今爲止,它是唯一的一個這樣可行。 我知道有很多方法可以使這些功能更好地工作,但我對承諾並不陌生,不知道如何在大多數基本功能之外使用它們。歡迎任何有關如何使此代碼更好的建議。

+1

'knex'的關鍵在於避免原始查詢執行,並且完全違背這一點,因此放棄使用'knex'的所有好處。對於原始查詢執行,[pg-promise](https://github.com/vitaly-t/pg-promise)將更適合;) –

+0

當我學習如何讓查詢不那麼原始時正確使用它。 – jjustas

回答

2

你似乎缺少的是一堆退貨。

這裏有兩個功能鏤空版本,包括必要的回報:

exports.buildBuoyFeaturesJSON = function(conditionA, conditionB) { 
    return knex.select (...) 
    ^^^^^^ 
    .from(...) 
    .then(function(response) { 
     // synchronous stuff 
     // synchronous stuff 
     return getMeasurementsAndSensors(keys, geometry_array); 
     ^^^^^^ 
    }).then(function(geometry_array) { 
     var feature_collection = GEOGRAPHY_METADATA; 
     feature_collection.features = geometry_array; 
     return feature_collection; 
     ^^^^^^ 
    }); 
}; 

function getMeasurementsAndSensors(keys, geometry_array) { 
    return knex.select(...) 
    ^^^^^^ 
    .from(...) 
    ... 
    .whereRaw(...) 
    .orderByRaw(...) 
    .then(function(response) { 
     // heaps of synchronous stuff 
     // heaps of synchronous stuff 
     // heaps of synchronous stuff 
     return geometry_array; 
     ^^^^^^^^^^^^^^^^^^^^^ 
    }); 
} 

我感動feature_collection採集部分成buildBuoyFeaturesJSON(),它似乎更邏輯坐在那裏的基礎上。如果不是,那麼將它移回getMeasurementsAndSensors()將會非常簡單。

我還沒有嘗試修復@ vitaly-t突出顯示的其他問題。

+1

這工作得很好!我知道有一些缺失,但無法弄清楚它是什麼。謝謝! – jjustas