我想用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是一種非常冗餘的方式,但迄今爲止,它是唯一的一個這樣可行。 我知道有很多方法可以使這些功能更好地工作,但我對承諾並不陌生,不知道如何在大多數基本功能之外使用它們。歡迎任何有關如何使此代碼更好的建議。
'knex'的關鍵在於避免原始查詢執行,並且完全違背這一點,因此放棄使用'knex'的所有好處。對於原始查詢執行,[pg-promise](https://github.com/vitaly-t/pg-promise)將更適合;) –
當我學習如何讓查詢不那麼原始時正確使用它。 – jjustas