我有一个要插入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)
*/