0

我正在尝试通过它们itemId的 s将一些项目插入quantities到我的sqlite3数据库中,然后通过将它们与另一个表项的比较来更新这些插入的项目itemId

我已经将所有内容都包装在Promises 中以尝试完成此操作,但无法让事情运行。

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.

也许我需要重组我的 SQL 表或以其他顺序调用事物?我对 SQL 没有深入的了解,但我确实在 sqlfiddle 上尝试过同样的事情,并且那里的 SQL 语句看起来很好,所以这似乎是一个 JavaScript/异步问题。我还尝试在orderedItems不使用WHERE条件与表进行比较的情况下更新menuItems表,这很有效。因此,当我将 与 进行比较时,似乎出现了orderedItems.itemId问题menuItems.itemId

4

1 回答 1

0

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

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"
  + "         );"
...

就像我提到的,在使用 MySQL 对 sqlfiddle 进行测试时,查询运行良好,所以我想知道 SQLite3 是否需要使用子查询。

于 2018-08-15T14:42:38.710 回答