如何在 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响应返回
如何使用 Laravel 4.2 在单个查询(不是 for 查询循环)中批量插入或更新
NodeJS,如何强制异步 for 循环在传递到下一次迭代之前等待 HTTP 请求解决,这样我们就不会收到 EMFILE 错误?