如何使用myql2大容量插入SQL



我有一个要插入SQL 的数据数组

let arr = [
{name:"john", age:8, country:"america"},
{name:"jack", age:9, country:"england"},
{name:"bob", age:12, country:"france"},
{name:"lance", age:6, country:"spain"}
]

我正在使用带有nodejs的mysql2库。这就是我现在正在做的事情。

const transfer = async() => {
for(person of arr){
let sql = `INSERT INTO users(name, age, country) VALUES("${person.name}", ${person.age}, "${person.country}")`;
const [res, _] = await db.execute(sql);
}
}

这很好,但我想知道是否有一种方法可以在一个sql查询中输入arr中的所有对象(而不是每次插入都输入一个查询)。

让我先向您解释一下。

let sql = `INSERT INTO users(name, age, country) 
VALUES("${person.name}", ${person.age}, "${person.country}")`;

不要使用Template literals将输入放入SQL查询中。它很危险,会让你面临SQL injection attack的风险。如今,每个数据库驱动程序都有一种安全的方式将您的输入注入字符串,您必须使用它们才能安全,在mysql2中,您可以这样做。

const query = mysql2.format(
"INSERT INTO table_test (name , last_name , year) VALUES (? , ? , ?)",
["iman", "hpr", 2022]
);
/* Result : 
INSERT INTO table_test (name , last_name , year) VALUES ('iman' , 'hpr' , 2022)
*/

如果您想进行大容量插入,可以通过提供一个嵌套的输入数组作为参数来轻松完成。

const query = mysql2.format(
"INSERT INTO table_test (name , last_name , year) VALUES ?",
[[
["iman", "hpr", 2022],
["name2", "last_name2", 2024],
["name3", "last_name3", 2023],
]]
);
/* Result
INSERT INTO table_test (name , last_name , year) VALUES ('iman', 'hpr', 2022), ('name2', 'last_name2', 2024), ('name3', 'last_name3', 2023)
*/

最新更新