在sql.js上运行两次查询

时间:2018-10-23 18:54:37

标签: node.js sqlite sql.js

我在我的项目上使用带有sql.js的SQLite,并且在实现过程中遇到了一些麻烦。好像查询在数据库上运行了两次,因为对于INSERT语句,我在数据库中获得2条记录。

我这样做的方法是创建SQL,然后将其传递给此方法(opts变量包含要放入数据库中的所有数据):

prepareStatementAndCompileResults(db, sql, opts){
   const stmt = db.prepare(sql); 
   const result = stmt.getAsObject(opts);
   var rows = [];
   if(!this.isEmpty(result)){ // isEmpty is a simple method that checks for empty objects
      rows.push(result);
   } 
   while(stmt.step()) {
      var row = stmt.getAsObject();
      rows.push(row); 
   }
   this.saveToFile(db);
   stmt.free();
   return rows; 
},

这是一个示例SQL INSERT,它正在运行两次

INSERT OR IGNORE INTO tag_event (tag_id, event_id, unique_string) 
  VALUES (:tag_id,:event_id, :unique);

以下是此查询的opts变量:

var opts = {
   [':tag_id']: 1,
   [':event_id']:1, 
   [':unique']: '1-1'
}

2 个答案:

答案 0 :(得分:0)

因为您要将其推入第2行。

// if not empty will add to row
if(!this.isEmpty(result)){ // isEmpty is a simple method that checks for empty objects
    rows.push(result);
} 


// not sure what step() does but I'm assuming this will also run
while(stmt.step()) {
      var row = stmt.getAsObject();
      rows.push(row); 
}

使用调试器或在保存之前的while循环之后console.log(rows)进行验证

答案 1 :(得分:0)

因此,事实证明,我需要做的是在获取变量之前将变量绑定到准备好的语句,而不是通过getAsObject进行绑定。这样效率更高。我在本地测试中的API响应时间从785ms缩短到14.5ms

prepareStatementAndCompileResults(db, sql, opts){
    const rows = [];
    const stmt = db.prepare(sql); 
    stmt.bind(opts);

    while(stmt.step()) {
       var row = stmt.getAsObject();
       rows.push(row); 
    }
    this.saveToFile(db);
    stmt.free();
    return rows; 
},