我在我的项目中使用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'
}发布于 2018-10-24 04:44:07
因为你把它推到了第二排。
// 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)进行验证
发布于 2018-10-24 05:34:54
因此,事实证明,我需要做的是在获取之前将变量绑定到准备好的语句,而不是通过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;
},https://stackoverflow.com/questions/52956066
复制相似问题