Как вставить в таблицу SQL, используя цикл for в NodeJS? - PullRequest
0 голосов
/ 11 октября 2019

У меня проблемы с поиском правильного синтаксиса SQL при добавлении элементов в мою таблицу с использованием циклов for и массива. Вот что я пытаюсь сделать:

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')
        });

    })
}

Какой синтаксис должен быть в операторе con.query (), чтобы сохранить эти значения в таблице mysql? Это что-то еще, что я пробовал, но это не работает

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')
        });

    })
}

Ответы [ 3 ]

0 голосов
/ 11 октября 2019

Я бы предложил использовать 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]} )`
            );
        })
    );
});
0 голосов
/ 11 октября 2019

Я исправил SQL-запрос, мне просто нужно было добавить кавычки, так как это была строка: это SQL-запрос, который работал для меня

`INSERT INTO maintable (mainaddress, latitude, longitude) VALUES ('${addreses[i]}', ${latitude[i]}, ${longitude[i]})`

0 голосов
/ 11 октября 2019

вы могли бы написать

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')
        });
    })
}
...