【问题标题】:Sqlite SQLITE_MISUSE error in node.js scriptnode.js 脚本中的 Sqlite SQLITE_MISUSE 错误
【发布时间】:2012-08-21 19:02:41
【问题描述】:

当我使用此查询启动代码时,有时我可以看到列出的所有表,有时只有一个,并且我总是收到此错误:

查询错误:错误:SQLITE_MISUSE:未知错误

我读到 SQLITE_MISUSE 是在 SQLITE API 使用不当时发生的。你能帮我吗,因为我找不到这段代码有什么问题。

编辑。我已经对代码进行了更改,以摆脱种族问题。

带有 SQLITE_MISUSE wrror 的消息仍然出现,但是消失的表问题消失了。我的查询中的种族就是这种情况。

这里是代码。

var sqlite3 = require("node-sqlite3");
var fs = require('fs');

var query_count;
var init = function (response) {
    var db = new sqlite3.Database("test.db", function() {

        fs.readFile('./assets/sql/initDB.sql', function(err,data){
            if(err) {
                console.error("Could not open file: %s", err);
                return;
            }

            var query = data.toString('utf8');
            queries = query.split(";");

            db.serialize(function() {
                query_count = queries.length;
                for(var i=0; i<queries.length; i++) {
                    queries[i] = queries[i].replace("\r\n","");
                    db.run(queries[i], function(error) {
                        if(error) {
                            console.log("Query Error: "+error);
                        }

                        query_count--;

                        if( query_count <= 0 ) {
                            db.close();
                            listAllTables(response);
                        }
                    });
                }
            });
        });
    });
};

function listAllTables(response) {
    var db = new sqlite3.Database("./assets/sql/test.db", function () {
        db.all("SELECT name FROM sqlite_master WHERE type = 'table'", function (error, records) {
            for(var record in records) {
                response.write(record+": "+records[record]+"\n");
                for(var prop in records[record]) {
                    response.write("\t"+prop+": "+records[record][prop]+"\n");
                }
            }

            response.end();
            db.close();
        });
    });
}

exports.load_customers = function(response) {
    init(response);
};

查询文件initDB.sql是这样的:

CREATE TABLE IF NOT EXISTS TemporaryAuthTokens (
  authToken TEXT PRIMARY KEY NOT NULL UNIQUE,
  expireDate NUMERIC NOT NULL);

CREATE  TABLE IF NOT EXISTS User (
  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE  ,
  login TEXT NOT NULL ,
  pass TEXT NOT NULL ,
  creationDate NUMERIC NOT NULL ,
  authToken TEXT NULL REFERENCES TemporaryAuthTokens(authToken)
  );

【问题讨论】:

  • 我可以补充一下,该错误仅由 init 函数中的代码引起(我已分别尝试过 init 和 SELECT query load_customers)。

标签: javascript node.js sqlite


【解决方案1】:

你有一个竞争条件;您的最后一个查询(其回调关闭连接)可能会在之前的一个查询完成之前完成,不用说,这会影响之前的查询。您需要重新编写代码,以便对 finish 的最后一个查询,而不是对 start 的最后一个查询,关闭连接(例如,设置查询数量的计数器和让每个查询在完成时将其递减。将其递减为零的查询将关闭连接)。

您可能还想查看可用于数据库对象的serialize 方法。现在您的初始化查询都是相互独立的,但是如果您开始使用外键约束,如果尚未创建引用的表,您将遇到麻烦,因此您需要强制执行顺序。

【讨论】:

  • 感谢您的回复。由于您的建议,我已经更改了我的数据库关闭条件,还添加了序列化模式。不幸的是,错误仍然发生,但它的消息从“未知错误”略微更改为“不是错误”:查询错误:错误:SQLITE_MISUSE:不是错误
  • 请编辑您的问题以反映您的新代码。表格是否正确创建?
  • 我已经编辑了问题消息中的代码。当我写到仍然发生错误时,我想到了 SQLITE_MISUSE 消息。表格消失错误已修复。
  • 更改您的错误处理程序以打印出导致错误的查询(您必须使用一些即时函数技巧来创建新的闭包,因为当回调执行时 i 将发生变化从查询开始时的状态)。
  • 我终于明白了。当我用“;”分割我的查询时我忘记了文件末尾有“;”,所以带有查询的数组的最后一个元素是空字符串。 SQLITE_MISUSE 被调用,因为 SQLite 似乎不喜欢空字符串作为查询......总而言之,感谢 ebonhlman 的帮助!
【解决方案2】:

使用承诺。

这里我从一个表中获取数据,并使用这些数据来创建一个用于插入另一个表的语句。

serialize() 确实运行 1×1,但我希望一个查询的响应用于另一个查询。如果我将2nd 查询放在1st 的回调中,那么它会给出SQLITE_MISUSE 错误

db.serialize(()=>{

    // QUERY 1 (SELECT) - Get data 
    let promiseGetFoo = new Promise((resolve, reject) => {
      db.all("SELECT * FROM foo", (err, rows) => {
        if (err) {
          console.log(err);
          reject(err);
        } else {
          resolve(rows);
        }
      });
    });

    // QUERY 2 (INSERT) - Use data from QUERY 1
    promiseGetFoo.then((res) => {
      let stmt = (res) => { 
        // code to create INSERT statement 
      }      
      db.run(stmt, (err) => {
        if(err) console.log(err);
        else console.log(">>> Insert DONE");
        closeDb();
      });
    });

});

let closeDb = () => {
    db.close() ;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2011-12-07
    • 2021-08-07
    相关资源
    最近更新 更多