Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在INSERT语句之后执行UPDATE语句时出现node-sqlite3错误_Javascript_Node.js_Sqlite_Node Sqlite3 - Fatal编程技术网

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

Javascript 在INSERT语句之后执行UPDATE语句时出现node-sqlite3错误,javascript,node.js,sqlite,node-sqlite3,Javascript,Node.js,Sqlite,Node Sqlite3,我试图通过它们的itemIds和quantity将一些项目插入我的sqlite3数据库,然后通过与另一个表项目的itemIds进行比较来更新这些插入的项目 我已经用Promises包装了所有东西,试图实现这一点,但一直无法运行 function makeOrderHandler(request, response, data) { insertOrder(request, response, data) .then(() => updateItemNames(req

我试图通过它们的
itemId
s和
quantity
将一些项目插入我的
sqlite3
数据库,然后通过与另一个表项目的
itemId
s进行比较来更新这些插入的项目

我已经用
Promise
s包装了所有东西,试图实现这一点,但一直无法运行

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
函数makeOrderHandler(请求、响应、数据){
插入顺序(请求、响应、数据)
.then(()=>updateItemNames(请求、响应、数据))
.然后(()=>{
log(“更新的项目!”);
})
.catch(错误=>{
log(“捕获错误:+err”);
});//结束承诺链
}//结束makeOrderHandler
函数插入顺序(请求、响应、数据){
返回新承诺(功能(解决、拒绝){
var db=require('./DBManager.js').getPool();
for(设i=0;i
抛出的错误似乎来自
updateItemNames()
函数:

捕获错误:SQLite3更新错误:错误:SQLITE\u错误:近“,”:语法错误


也许我需要重新构造我的SQL表或以另一种顺序调用东西?我对SQL没有深入的了解,但我在sqlfiddle上也做了同样的尝试,SQL语句似乎很好,所以这似乎是一个JavaScript/异步问题。我还尝试更新了
orderedItems
表,但没有使用
WHERE
条件来与
menuItems
表进行比较,结果成功了。因此,当我将
orderedItems.itemId
menuItems.itemId
进行比较时,似乎出现了一个问题,将查询更改为包含子查询(以某种方式)解决了我的问题:

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在SQLFIDLE上测试时,查询工作得很好,所以我想知道SQLite3是否需要使用子查询

每个update语句只能更新一个表。