【问题标题】:SQL statement stops after one insertSQL 语句在一次插入后停止
【发布时间】:2018-07-18 05:04:21
【问题描述】:

我试图多次插入到我的数据库中,但 INSERT sql 语句仅在第一次被调用时才起作用,然后继续执行而不插入。我不知道这是否相关,但我正在使用 Cheerio 从网络抓取中获取这些数据。

这段代码运行良好,没有产生错误。但是它执行 SQL 查询只有一次,第一次被调用。为什么?

这是我的代码

remainingList.map(function (val) {

    const options = {
      uri: val,
      transform: function (body) {
        return cheerio.load(body);
      }
    };

    rp(options).then(($) => {
        title = $(".Lien5").text();
        price = $(".Texte8").text();
        contenu = $(".contenu").text();
    }).then(($) => {
        connection.query(`INSERT INTO WatchesList (url, title, price) VALUES ("${val}", "${title}", "${price}")`);
    });

});

【问题讨论】:

  • 输出有错误吗?
  • 绝对没有。我什至console.log(title) 只是为了看看,它每次都能正确显示标题。
  • 好吧,我知道这不会回答您的问题,但我认为如果您可以在 map 函数中构造值列表并使用串联值执行 INSERT INTO 会更好。你可以插入(...)值(),(),()等等,我认为mysql也支持这一点。所以一个插入语句毕竟更好。
  • 你怎么知道它只执行一次SQL查询?

标签: javascript mysql node.js node-mysql


【解决方案1】:

文档说:

使用 end() 关闭连接,确保在向 mysql 服务器发送退出数据包之前执行所有剩余的查询。

所以尝试执行以下操作:

const insertPromises = remainingList.map(function (val) {

    const options = {
      uri: val,
      transform: function (body) {
        return cheerio.load(body);
      }
    };

    return rp(options).then(($) => {
        title = $(".Lien5").text();
        price = $(".Texte8").text();
        contenu = $(".contenu").text();
    }).then(($) => {
        return new Promise((resolve, reject) => {
            connection.query(`INSERT INTO WatchesList (url, title, price) VALUES ("${val}", "${title}", "${price}")`, 
            (error) => {
                 if (error) {
                      reject();
                 } else {
                      resolve();
                 }                     
            });
        });
    });
});

Promise.all(insertPromises).then(() => connection.end());

【讨论】:

  • @mokiliii Lo 。解决方案有效吗?请告诉我们。
猜你喜欢
  • 1970-01-01
  • 2016-11-26
  • 2021-10-31
  • 1970-01-01
  • 2012-01-11
  • 2015-04-03
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多