我有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函数的标准实现一样。但是,对此的任何指示都表示赞赏。