MySql2-Nodejs-如何构建复杂查询?

MySql2-Nodejs-如何构建复杂查询?,mysql,node.js,query-builder,Mysql,Node.js,Query Builder,我正在node服务器上使用mysql2包。 我有一个迭代的值数组。在循环中,我构建了我的查询。我希望最终结果看起来像: INSERT INTO table (url, caption, username, type, timestamp) VALUES ("https://www.url.com/123", "my caption1", "user1", "image", "12423423"

我正在
node
服务器上使用
mysql2
包。 我有一个迭代的值数组。在循环中,我构建了我的查询。我希望最终结果看起来像:

INSERT INTO table (url, caption, username, type, timestamp)
  VALUES ("https://www.url.com/123", "my caption1", "user1", "image", "12423423"),
         ("https://www.url.com/124", "my caption2", "user2", "image", "12423567"),
         ("https://www.url.com/125", "my caption3", "user3", "image", "12423890")
ON DUPLICATE KEY UPDATE 
   username=VALUES("user1", "user2", "user3")
目前,我正在将
插入值
构建为一个字符串,并传入一个
来替换整行。见下文:

   //Use this as a query shell
   let queryPlaceholder = `INSERT INTO table (url, caption, username, type, timestamp)
         VALUES ?
         ON DUPLICATE KEY UPDATE username=VALUES(?)`

   data.foreach(item => {
      //Long string - to replace the first `?` in the queryPlaceholder
      valuesToInsert += "('" + item.url + "', '" + item.caption + "','" + item.username + "','" + item.type + "','" + item.timestamp + "'), ";
      
      //Replace the second `?` in the queryPlaceholder
      usernamesToUpdate += "'" + item.username + "', ";
   }
   //Get rid of trailing commas and space
   valuesToInsert = valuesToInsert.slice(0, -2);
   usernamesToUpdate = valuesToInsert.slice(0, -2);

   conn.query(queryPlaceholder, [valuesToInsert, usernamesToUpdate], function........)
我意识到这看起来很混乱,而且我没有正确使用mysql2。此外,所有引号都会被转义,即使它们是查询本身的一部分


我应该如何构建这样一个查询,而不是我目前正在做的事情?这样才能正确转义
标题
和其他字段中的引号?

与其尝试构建一个复杂的语句,不如多次发送一个简单的语句

const sql=`
插入到表中(url、标题、用户名、类型、时间戳)
值(?,,,,?,?)
重复密钥更新;
`;
data.foreach(项=>{
conn.query(sql[item.url,item.caption,item.username,item.type,item.timestamp],回调);
});

如果要将更新视为一个块,请使用事务:

function executeAll(连接、sql、数据、回调){
var abort=false;
conn.beginTransaction((错误)=>{
if(err)返回回调(err);
data.foreach((参数,i)=>{
如果(中止)返回;
conn.query(sql,参数,(错误)=>{
如果(错误){
中止=真;
返回连接回滚(()=>回调(err));
}
如果(i<参数长度)返回;
conn.commit((错误)=>{
if(err)返回conn.rollback(()=>callback(err));
回调();
});
});
});
});
}
用法:

const sql=`
插入到表中(url、标题、用户名、类型、时间戳)
值(?,,,,?,?)
重复密钥更新;
`;
常数数据=[
["https://www.url.com/123“,“我的字幕1”,“用户1”,“图像”,“12423423”],
["https://www.url.com/124“,“我的字幕2”,“用户2”,“图像”,“12423567”],
["https://www.url.com/125“,“我的字幕3”,“用户3”,“图像”,“12423890”]
];
executeAll(连接、sql、数据,(错误)=>{
if(err)返回console.log(err);
console.log(“全部完成”);
});

我强烈建议您查看sequelize.org,这是一个ORM。使用ORM来帮助构造查询,而不是手动编写查询,这是一个更好、更安全的想法。