Запросы запускаются дважды на sql.js - PullRequest
0 голосов
/ 23 октября 2018

Я использую SQLite с sql.js в своем проекте, и у меня возникли некоторые проблемы с моей реализацией.Похоже, запросы выполняются в базе данных дважды, потому что для операторов 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 голосов
/ 24 октября 2018

Итак, оказалось, что мне нужно было связать переменные с подготовленным оператором, прежде чем получать, а не связывать их через getAsObject.Это гораздо эффективнее.Время отклика API в локальном тесте увеличилось с 785 мс до 14,5 мс

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 голосов
/ 23 октября 2018

Поскольку вы помещаете его в строку 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); 
}

Проверьте с помощью отладчика или просто console.log(rows) после цикла while перед сохранением

...