首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sql.js上运行两次的查询

在sql.js上运行两次的查询
EN

Stack Overflow用户
提问于 2018-10-24 02:54:37
回答 2查看 99关注 0票数 0

我在我的项目中使用SQLite和sql.js,在我的实现上遇到了一些问题。查询似乎在数据库上运行了两次,因为对于INSERT语句,我在数据库中得到了2条记录。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
INSERT OR IGNORE INTO tag_event (tag_id, event_id, unique_string) 
  VALUES (:tag_id,:event_id, :unique);

下面是该查询的opts变量:

代码语言:javascript
复制
var opts = {
   [':tag_id']: 1,
   [':event_id']:1, 
   [':unique']: '1-1'
}
EN

回答 2

Stack Overflow用户

发布于 2018-10-24 04:44:07

因为你把它推到了第二排。

代码语言:javascript
复制
// 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)进行验证

票数 0
EN

Stack Overflow用户

发布于 2018-10-24 05:34:54

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

代码语言:javascript
复制
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; 
},
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52956066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档