如何使用NodeJS Streams从通用函数查询多个DB

时间:2017-06-22 07:20:23

标签: javascript mysql node.js stream nodejs-stream

我有Nodejs项目,它从几个数据库中读取数据(db info和要执行的查询通过配置文件提供),并将其作为csv上传到S3。现在问题是数据可能非常大,因此需要使用流来避免内存使用爆炸。这可以很容易地为任何数据库完成,下面给出了mysql的一个例子:

connection
.query('SELECT * FROM TABLE')
.stream({ highWaterMark: 5 })
.pipe(someFunction);

但是,这是一个特定于mysql的实现。我需要设计代码,使main函数调用一个名为“queryGeneric”的标准库函数。此queryGeneric Function接受dbType参数,然后调用特定于db的函数。如何为此queryGeneric函数使用流?

queryGeneric Function的示例如下:

constants.js

DB_FUNCTIONS = {
'MYSQL' : 'mysql.js',
'MSSQL' : 'mssql.js
}

genericDbFunctions.js

function queryGeneric(connection, dbName, statement, callback) {
    var dbFxns = require(constants.DB_FUNCTIONS[dbName]);
    var data = dbFxns.query(connection, statement, function(err, results) {
        return callback(err, results);
    });
    }

mysql.js

function query(connection, statement, callback) {
    connection.query(statement, function(err, results) {
        return callback(err, results);
    });
}

类似地,可以有mssql.js或postgresql.js等包含这些特定于数据库的函数的文件。 queryGeneric Function使用constants.js文件中提供的映射计算要调用的相关函数。

现在我的main.js会调用queryGeneric函数,如下所示: main.js

//code to read the config file
//loop start for each db in the config file
    var connection = getConnectionGeneric(dbName);
    queryGeneric(dbWrapper, 'SELECT * FROM TABLE', function(err, results){//Some action})

//loop end

上面的main.js文件实际上是非常类似的伪代码,以这种方式编写,目的是提出这个问题。 main.js实际上循环一个配置文件,从那里读取规范(连接信息和运行查询),并为每个数据库调用queryGeneric。

如何将queryGeneric函数调用转换为:

main.js

queryGeneric(dbWrapper, 'SELECT * FROM TABLE').stream({ highWaterMark: 5 }).pipe(someFunction);

感谢任何帮助。如果需要更多细节或说明,请告诉我。

此外,上面代码段中的someFunction需要是一个将数据上传到S3的函数。我希望如果流按预期实现,上传功能应该像所有提供的uploadToS3函数的标准实现一样。但是,对此的任何指示都表示赞赏。

0 个答案:

没有答案