mysql - 从nodejs逐行写入mysql表
问题描述
我有一个 nodeJS 代码写入 mysql 中的表。这个过程很长,需要写入大约 100 万个条目。所以很费时间。我想要的是使发送到 mysql 的记录在它们一一提交到数据库时可用于查询。但是,我的代码似乎在提交到数据库之前收集了所有记录。所以我无法在代码执行时查询数据库。我怎样才能改变这个?我需要一种情况,即代码向数据库提交一个条目,并且该条目在数据库中可用于来自外部源(例如 mysql 工作台)的查询。
"use strict";
const mysql = require("mysql");
// Create connection
const db = mysql.createConnection({
host: "localhost",
user: "root",
password: "somePassword",
database: "tickers"
});
// Connect
db.connect(err => {
if (err) {
throw err;
}
console.log("MySQL connected");
for (var uniqueSets = 0; uniqueSets < 1000000; uniqueSets++) {
// some programming logic here
// then calling the procedure to commit data to mysql>>>
sendToMYSQL(
t1,
t2,
t3
);
}
function sendToMYSQL(t1, t2, t3) {
let post = {
t1: t1,
t2: t2,
t3: t3
};
let sql = "INSERT INTO scope SET?";
let query = db.query(sql, post, (err, result) => {
if (err) throw err;
console.log(result);
});
}
解决方案
我的调查最终为这个问题找到了一个可行的解决方案。我相信问题出在mysql模块设置上。如果调用它的进程未完成,似乎 db.query 不会将数据提交到服务器。我尝试了几乎所有我能想到的东西,包括 Promise、async、await、process.nextTick()、不同的代码结构等。但最终对我有用的是以下内容。我替换了 for () 迭代,它进行计算,然后用一个包含计算编程逻辑的新函数调用 sendToMYSQL。我引入了一个全局计数器来计算这个新函数被调用的次数。我在代码开头调用该函数一次。然后在 sendToMYSQL 中,如果低于目标计算次数,我会增加计数器并再次调用新函数。结果 sendToMYSQL 在收到数据时开始将数据提交到服务器,并且这些数据可用于来自外部程序的服务器查询。该解决方案确实增加了该过程的时间长度,但我很高兴找到了解决方案。这是代码:
"use strict";
const mysql = require("mysql");
const db = mysql.createConnection({
host: "localhost",
user: "root",
password: "somePassword",
database: "tickers"
});
db.connect(err => {
if (err) {
throw err;
}
console.log("MySQL connected");
})
var uniqueSets = 0 // this is the global counter
execute();
function execute() {
// some calculations using uniqueSets as a pointer to some array
sendToMYSQL(
t1,
t2,
t3
);
}
function sendToMYSQL(t1, t2, t3) {
let post = {
t1: t1,
t2: t2,
t3: t3
};
let sql = "INSERT INTO scope SET?";
let query = db.query(sql, post, (err, result) => {
if (err) throw err;
console.log(result);
if (uniqueSets < 100000) {
uniqueSets++;
execute()
} else {
console.log('finished');
db.end();
}
});
}
推荐阅读
- webview - Flutter:Web视图应用程序只运行在应用程序中的特定网站,其他在手机本地浏览器中打开
- ruby-on-rails - Remove quantity in the next object if first object quantity == 0
- angular - NGXS 动作类型
- ios - 我无法将我的应用程序提交到 appStore(错误 ERROR ITMS-90685,错误 ITMS-90347)
- excel - max_date的Excel数组公式
- javascript - 正则表达式提取参数字符串中的值
- java - 如何删除使用 JPanel 实现的 Java 程序中的图形?
- android - 与 Android Studio 集成的增强现实 - 将 Vuforia SDK 集成到现有的 android studio 项目中
- azure-blob-storage - 添加或修改 blob 时的逻辑应用向我发送垃圾邮件
- javascript - 如何使用 amCharts 对用作项目符号的图像进行舍入?