NodeJS,将来自 MySQL 和 PostgreSQL 的数据存储在 SQLite 中

Posted

技术标签:

【中文标题】NodeJS,将来自 MySQL 和 PostgreSQL 的数据存储在 SQLite 中【英文标题】:NodeJS, storing data in a SQLite from both a MySQL and a PostgreSQL 【发布时间】:2017-06-20 13:42:18 【问题描述】:

我创建了一个同时使用 SQLite、mysql 和 PostgreSQL 的脚本。 我从 PostgreSQL 中获取值,我用它来调用 MySQL,最后将其存储在 SQLite 中。 然后将 SQLite 用于其他应用程序。我正在考虑将 node.js 脚本作为 cron 作业每半小时运行一次。

这是我的代码:https://jsfiddle.net/bjo93syg/

var pgPromise = require('pg-promise')();
var mysql     = require('mysql');
var sqlite3   = require('sqlite3').verbose();

var pgConnection = pgPromise('postgres://my-user@localhost/my-db');

var mysqlConnection = mysql.createConnection(
  host     : 'localhost',
  user     : 'my-user',
  password : 'my-pass',
  database : 'my-database'
);

var sqliteConnection = new sqlite3.Database('test.db');

sqliteConnection.serialize(function () 
    sqliteConnection.run("BEGIN TRANSACTION");
    sqliteConnection.run("DROP TABLE IF EXISTS numbers");
    sqliteConnection.run("CREATE TABLE numbers (xnumber BIGINT)");
    var stmt = sqliteConnection.prepare("INSERT INTO numbers VALUES (?)");

    pgConnection.any('SELECT ...')
        .then(function(data) 
            for (var i = 0; i < data.length; i++) 
                mysqlConnection.query('SELECT ...?', [my_value], function (error, results, fields) 
                    if (error) console.log(error);
                    for (var j = 0; j < results.length; j++) 
                        stmt.run(results[j].x);
                    
                    stmt.finalize();
                    sqliteConnection.run("COMMIT");

                    sqliteConnection.close();
                    mysqlConnection.end();
                    // pgConnection is a lazy connection, i.e. only the actual query methods acquire and release the connection
                );
            
        )
        .catch(function(err) 
            console.log(err);
        );
);

代码实际上似乎可以运行,但运行大约需要 30 秒。 当我将 console.logs 添加到代码中以查看占用时间时,似乎所有数据库处理实际上都在不到一秒的时间内运行,但整个 node server.js 大约需要 30 秒。

我是否需要关闭某些内容,或者如何调试占用时间的内容?

【问题讨论】:

也许你把代码和console.log放在一起——看看什么运行得很快并相应地输出? 我做到了,在 mysqlConnection.end() 之后的 console.log() 在一秒钟内出来了,然后应用程序的其余部分运行了大约 29 秒。在脚本上运行 --prof 显示:40.3% ___mac_get_pid。 【参考方案1】:

根据pg-promise 的Library de-initialization 注释,并在所有examples 中显示...

在处理结束时,调用pgPromise.end(),关闭连接池,这样进程就可以完成,没有任何延迟。

【讨论】:

以上是关于NodeJS,将来自 MySQL 和 PostgreSQL 的数据存储在 SQLite 中的主要内容,如果未能解决你的问题,请参考以下文章

如何以刷新率在nodejs中显示来自mysql的数据

用户输入表单后显示数据(mysql-nodejs)

NodeJS + Mysql 与 Docker Compose 2

Redis sub/pub 和 php/nodejs

我如何使用 MongoDB 在 NodeJS 中编写以下 MySQL Select?

将 Mysql 与 Nodejs 和 Express 一起使用 (node-mysql)