【问题标题】:How to insert into a SQL table using a for-loop in NodeJS?如何在 NodeJS 中使用 for 循环插入 SQL 表?
【发布时间】: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')
        });

    })
}

【问题讨论】:

    标签: mysql sql arrays node.js for-loop


    【解决方案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',我确实遵循了您关于只创建一个连接的建议!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2021-09-21
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多