我有 Nodejs 项目,它从多个数据库中读取数据(通过配置文件提供要执行的数据库信息和查询)并将其作为 csv 上传到 S3。现在的问题是数据可能非常非常大,因此需要使用流来避免内存使用量爆炸。这可以轻松地为任何数据库完成,下面给出了 mysql 的示例:
connection
.query('SELECT * FROM TABLE')
.stream({ highWaterMark: 5 })
.pipe(someFunction);
但是,这是 mysql 特定的实现。我需要以这样的方式设计代码,即主函数调用一个名为“queryGeneric”的标准库函数。此 queryGeneric 函数采用 dbType 参数,然后调用特定于 db 的函数。我如何为这个 queryGeneric 函数使用流?
queryGeneric 函数的示例如下:
常量.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 等文件,其中包含那些特定于 db 的函数。queryGeneric 函数使用 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功能的标准实现。但是,对此也有任何指示。