1

我有 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功能的标准实现。但是,对此也有任何指示。

4

0 回答 0