如何使用mysql2批量插入SQL?

问题描述 投票:0回答:2

我有一组数据想要插入到 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"}
]

我正在将 mysql2 库与 nodejs 一起使用。这就是我现在正在做的事情。

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 中的所有对象(相对于每次插入的查询)。

node.js mysql2
2个回答
6
投票

我先给大家解释一下。

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)
*/

0
投票

只是为了省去任何人的麻烦...

1.您发送的是包装数组,而不是数组

像这样:

[[ [a,b,c], [a,b,c], [a,b,c] ]]

不是

[ [a,b,c], [a,b,c], [a,b,c] ]

2. 执行在mysql2中的倍数被破坏,只需更改为
.query

破碎:

await pool_PSQL.execute(`insert ..

只需更改为:

await pool_PSQL.query(`insert ..

3.请注意,“查询字符串”只是一个问号“?”

举个例子...

    var multi = []
    for (let i = 0; i < items.length; ++i) {
        const item = items[i]
        const r = [item.blah, item.bleh ...]
        multi.push(r)
    }

    await pool_PSQL.query(`insert into Things
        (bim, bam, ...)
        values ?`,
        [multi]
    )
© www.soinside.com 2019 - 2024. All rights reserved.