Sqlite等待数据库打开

问题描述 投票:0回答:1

我最近开始使用javascript和electronic。我想使用sqlite作为数据库技术。我的问题是当我打电话给:

OpenDB(dbPath);
CreateTable("sampleTable", "Column1 TEXT NOT NULL, Column2 TEXT NOT NULL");

程序实际上在不等待数据库打开的情况下调用CreateTable函数。 如果我使用延迟程序调用这两个函数,将按预期工作。我在下面编写了函数定义:

export function OpenDB(dbPath) {
    projectDB = new sqlite3.Database(dbPath, (err) => {
    if (err) {
       console.error(err.message)
       this.result =  false;
       return;
    }
    console.log('SQlite project database created.');
  });
}

export function CreateTable(tableName, tableColumns) {
    configDB.run('CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + tableColumns + ')' , (err) => {
        if(err) {
            console.error(err);
            console.log("Table couldn't created.")
            return;
        }
        console.log("Table created.")

    })

}

所以,我的问题是如何使CreateTable函数等待数据库实际打开?从我的阅读中可以理解,我需要创建回调函数,但是我无法成功完成它。而且我读的更多我更困惑。预先感谢。

javascript node.js sqlite callback
1个回答
0
投票
let db;
export function OpenDB(dbPath, cb) {
  db = new sqlite3.Database(dbPath, cb); 
}

export function CreateTable(tableName, tableColumns, cb) {
    db.run('CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + tableColumns + ')', cb);
}

并且欢迎回调地狱

OpenDb(dpPath, function (err) {
  if (err) 
     return console.error(err.message);

  CreateTable("sampleTable", "Column1 TEXT NOT NULL, Column2 TEXT NOT NULL", function (err) {
    if (err)
        return console.error(err);
  });
})

如果这种方式不合适,则使用promisification

let db;
export function OpenDB(dbPath) {
  return new Promise(function (resolve, reject) {
    db = new sqlite3.Database(dbPath, err => err ? resolve() : reject(err));
  });
}

export function CreateTable(tableName, tableColumns) {
  return new Promise(function (resolve, reject) {
    db.run('CREATE TABLE IF NOT EXISTS ' + tableName + ' (' + tableColumns + ')', 
       err => err ? resolve() : reject(err));
  }); 
}

和用法

OpenDb(dbPath)
  .then(() => CreateTable("sampleTable", "Column1 TEXT NOT NULL, Column2 TEXT NOT NULL"))
  .then(() => CreateTable("sampleTable2", "Column1 TEXT NOT NULL, Column2 TEXT NOT NULL"))
  .then(() => console.log('Complete'))
  .catch(err => console.error(err));
© www.soinside.com 2019 - 2024. All rights reserved.