如何在 NodeJS 中使用 for 循环插入 SQL 表?

Posted

技术标签:

【中文标题】如何在 NodeJS 中使用 for 循环插入 SQL 表?【英文标题】:How to insert into a SQL table using a for-loop in NodeJS? 【发布时间】:2020-02-08 09:55:26 【问题描述】:

在使用 for 循环和数组向表中添加项目时,我无法找到正确的 SQL 语法。这就是我想要做的:

var mysql = require('mysql');

var con = mysql.createConnection(
    host: "localhost",
    user: "root",
    database: 'DUSAgeocodeDB'
);

var addreses = ['addres1', 'address2', 'address3'];
var latitude = [12, 45, 789];
var longitude = [987, 654, 321];

for (var i =0; i <addreses.length; i++) 

    con.connect(function(err) 
        con.query(`INSERT INTO maintable (mainaddress, latitude, longitude) VALUES ($addreses[i], $latitude[i], $longitude[i] )`, function (err, result) 
            if(err) throw err;

            console.log('VALUES ADDED')
        );

    )


为了将这些值保存到 mysql 表中,con.query() 语句的正确语法是什么?这是我尝试过的其他东西,但它不起作用

for (var i =0; i <addreses.length; i++) 

    con.connect(function(err) 
        con.query("INSERT INTO maintable (mainaddress, latitude, longitude) VALUES ("+$mysql.escape(addreses[i])+", "+$mysql.escape(latitude[i])+", "+$mysql.escape(longitude[i])" )", function (err, result) 
            if(err) throw err;

            console.log('VALUES ADDED')
        );

    )

【问题讨论】:

【参考方案1】:

我建议利用Promise.all 这样您可以并行触发多个异步操作。 mysql 不附带承诺支持,但是,您可以使用msql2。在这里,我将现有的 con.query 包装在它自己的承诺中。

function queryPromise(query) 
    return new Promise((resolve, reject) => 
        con.query(query, (err, result) => 
            if (err) 
                return reject(err);
            

            return resolve(result);
        );
    );


con.connect(async (err) => 
    await Promise.all(
        addreses.map((_, i) => 
            return queryPromise(
                `INSERT INTO maintable (mainaddress, latitude, longitude) VALUES ($addreses[i], $latitude[i], $longitude[i] )`
            );
        )
    );
);

【讨论】:

非常感谢!我确实在我的代码中实现了这一点! @CarlosVides 欢迎您,不要忘记将回复标记为正确答案【参考方案2】:

你可以写

var mysql = require('mysql');

var con = mysql.createConnection(
    host: "localhost",
    user: "root",
    database: 'DUSAgeocodeDB'
);

var addreses = ['addres1', 'address2', 'address3'];
var latitude = [12, 45, 789];
var longitude = [987, 654, 321];

con.connect(function(err)  // create a single connection to execute all the queries
   for (let i=0; i < addreses.length; i++)  //use let instead of var to prevent issues with closures in asynchronous code
      con.query(`INSERT INTO maintable (mainaddress, latitude, longitude) VALUES ($addreses[i], $latitude[i], $longitude[i] )`, function (err, result) 
            if(err) throw err;
            console.log('VALUES ADDED')
        );
    )

【讨论】:

感谢您的评论,这不起作用我不断收到错误:ER_BAD_FIELD_ERROR: Unknown column 'addres1' in 'field list',我确实遵循了您关于只创建一个连接的建议!非常感谢

以上是关于如何在 NodeJS 中使用 for 循环插入 SQL 表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在for循环中等待每次迭代并在nodeJS中将响应作为API响应返回

如何在SQLserver中利用循环语句插入大量的数据

如何使用 Laravel 4.2 在单个查询(不是 for 查询循环)中批量插入或更新

在 Java for 循环中插入额外代码

通过for循环在nodejs中构造数组

NodeJS,如何强制异步 for 循环在传递到下一次迭代之前等待 HTTP 请求解决,这样我们就不会收到 EMFILE 错误?