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

时间:2018-08-13 21:19:55

标签: javascript node.js sqlite node-sqlite3

我试图通过itemIdquantities将一些项目插入我的sqlite3数据库,然后通过将其与另一个表项目的{{1 } s。

我将所有内容都包装在itemId中,以尝试完成此操作,但是还无法正常运行。

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()

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

1 个答案:

答案 0 :(得分: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是否需要使用子查询。