代码之家  ›  专栏  ›  技术社区  ›  natn2323

在INSERT语句之后执行UPDATE语句时出现node-sqlite3错误

  •  0
  • natn2323  · 技术社区  · 7 年前

    我正试图通过他们的 itemId s和 quantities 进入我的 sqlite3 数据库中,然后通过将这些插入项与另一个表项的 s。

    我把所有东西都包好了 Promise 他试图完成这项任务,但却没能让事情顺利进行。

    function makeOrderHandler(request, response, data) {
        insertOrder(request, response, data)
            .then(() => updateItemNames(request, response, data))
            .then(() => {
              console.log("Updated items!");
            })
            .catch(err => {
              console.log("Caught error: "+err);
            }); // end promise chain
    
    } // end makeOrderHandler
    
    function insertOrder(request, response, data) {
      return new Promise(function(resolve, reject) {
        var db = require('./DBManager.js').getPool();
    
        for(let i = 0; i < data['content'].length; i++) {
          let unit = data['content'][i];
    
          db.run("INSERT INTO orderedItems"
            + " (itemId, quantity) VALUES"
            + " ($itemId, $quantity);",
          {
            $itemId: unit.itemId,
            $quantity: unit.quantity
          },
          function(err) {
            if(!err) {
              // Could do something here
            } else {
              reject("SQLite3 insert error: "+err);
            } // end else
          }); // end run
        } // end for
        resolve();
    
      }); // end return
    } // end makeOrder
    
    function updateItemNames(request, response, data) {
      return new Promise(function(resolve, reject) {
        var db = require('./DBManager.js').getPool();
    
        db.run("UPDATE orderedItems, menuItems SET orderedItems.itemName = menuItems.itemName, orderedItems.unitPrice = menuItems.unitPrice WHERE orderedItems.itemId = menuItems.itemId;",
          function(err) {
            if(err) {
              reject("SQLite3 update error: "+err);
            } else if(this.changes == 1) {
              resolve();
            } else {
              reject("NOTHING DONE!!!");
            } // end else
          } // end error
        ); // end run
        // resolve();
    
      }); // end return
    } // end updateItemNames
    

    抛出的错误似乎来自 updateItemNames() 功能:

    Caught error: SQLite3 update error: Error: SQLITE_ERROR: near ",": syntax error .

    orderedItems 不使用 WHERE 比较的条件 menuItems 这张桌子很有效。所以当我比较 orderedItems.itemId menuItems.itemId .

    1 回复  |  直到 7 年前
        1
  •  0
  •   natn2323    7 年前

    将查询更改为包含子查询(以某种方式)解决了我的问题:

    db.run("UPDATE orderedItems"
      + " SET itemName ="
      + "     ("
      + "      SELECT menuItems.itemName"
      + "      FROM menuItems"
      + "      WHERE menuItems.itemId = orderedItems.itemId"
      + "     ),"
      + "     unitPrice ="
      + "     ("
      + "      SELECT menuItems.unitPrice"
      + "      FROM menuItems"
      + "      WHERE menuItems.itemId = orderedItems.itemId"
      + "     )"
      + " WHERE"
      + "     EXISTS "
      + "         ("
      + "          SELECT *"
      + "          FROM menuItems"
      + "          WHERE menuItems.itemId = orderedItems.itemId"
      + "         );"
    ...
    

    正如我提到的,在sqlfiddle上测试MySQL时,查询工作得很好,所以我想知道对于SQLite3是否有必要使用子查询。

    推荐文章