首页 > 解决方案 > 从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);
  });
}

标签: mysqlnode.js

解决方案


我的调查最终为这个问题找到了一个可行的解决方案。我相信问题出在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();
    }
  });
}

推荐阅读