Я играю с пакетом node-sqlite3 и столкнулся со странной ситуацией.
Этот простой сценарий имеет простую логику: найдите, если таблица существует, если она очищает ее, если нет - создайте ее.
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('guy.sqlite'); //':memory:'
var tableExists = false;
db.serialize(function() {
db.get("SELECT name FROM sqlite_master WHERE type='table' AND name='lorem'", function(error, row) {
tableExists = (row != undefined);
console.log("xxxxx " +tableExists);
});
console.log("yyyyy " +tableExists);
if (tableExists) {
console.log("table exists. cleaning existing records");
db.run("DELETE FROM lorem", function(error) {
if (error)
console.log(error);
});
}
else {
console.log("creating table")
db.run("CREATE TABLE lorem (info TEXT)", function(error) {
if (error.message.indexOf("already exists") != -1) {
console.log(error);
}
});
}
});
db.close();
Но результат, который я получаю:
yyyyy false
creating table
xxxxx true
{ stack: [Getter/Setter],
arguments: undefined,
type: undefined,
message: 'SQLITE_ERROR: table lorem already exists',
errno: 1,
code: 'SQLITE_ERROR' }
В соответствии с документацией команды serialize эти запросы должны выполняться последовательно. Тем не менее, очевидно, что оценка tableExists
(отмечена 'yyy') происходит до того, как установлено значение (отмечена 'xxx'), что вызывает попытку воссоздания существующей таблицы.
Я могу справиться с этой ошибкой, но мне было интересно, что является причиной этого и как избежать такого поведения в будущем.
Как всегда, спасибо за ваше время.
Guy