【问题标题】:Sqlite Electron: Error: SQLITE_CANTOPEN: unable to open database fileSqlite Electron:错误:SQLITE_CANTOPEN:无法打开数据库文件
【发布时间】:2020-06-10 20:32:01
【问题描述】:

我正在尝试在我的 Angular + Electron 应用程序中使用 node-sqlite3 打开一个 sqlite 数据库文件。

尽管我确保文件存在并且 Electron 可以读取它,但当我尝试使用以下方法创建 sqlite 数据库时:

import * as sqlite from 'sqlite3';

// ...

const path = `${__dirname}/assets/sqlite.db`;

const fs = require('electron').remote.require('fs');
console.log(path);
if (fs.existsSync(AppConfig.sqlitePath)) {
  console.log('the file exists');
} else {
  console.log('the file does not not');
}

const myDb = new sqlite.Database(path, sqlite.OPEN_READONLY, (error) => {
  console.log(error);
});

该文件存在,因为我收到了正确的 console.log 消息,它看起来像:

/tmp/.mount_xxxxxx/resources/app.asar.unpacked/dist/assets/sqlite.db

但是,来自new sqlite.Database(...) 我收到以下错误,因为该文件不存在:

错误:SQLITE_CANTOPEN:无法打开数据库文件

【问题讨论】:

  • 请问您为什么将数据库放在 assets 文件夹中?
  • @HoangTranSon 只是因为我希望它包含在应用程序构建的dist 目录中。我知道我可以通过在我的 angular.json 文件中添加一个新条目来使用不同的路径,但我只是想快速拥有一个工作原型,并且默认情况下包含 assets 文件夹。
  • 请问当您将该文件放入assets 文件夹时如何控制安全问题?我面临同样的反应问题,现在的解决方法是将 db 文件放入 public 文件夹。看起来不是个好办法。
  • @HoangTranSon 抱歉,我没有任何安全问题,因为我的 sqlite 数据库根本不包含任何敏感数据,而且它已经公开了

标签: node.js angular sqlite electron node-sqlite3


【解决方案1】:

artiebits 提示我查看asarUnpack,这确实是正确的方法。


我解决了:

1) 将以下内容添加到我的electron-builder.json:

"asarUnpack": [
  "dist/assets/sqlite.db"
],

2) 替换:

const path = `${__dirname}/assets/sqlite.db`;

与:

const path = `${__dirname}/assets/sqlite.db`.replace('app.asar', 'app.asar.unpacked');

【讨论】:

    【解决方案2】:

    这里使用 extraResources 参数的另一个解决方案:https://github.com/electron/electron/issues/4644#issuecomment-637030403

    # packages.json
    "build": {
        ...
        "extraResources": [
          "databaseFolder"
        ],
       ...
    }
    

    确保检查数据库文件是否存在然后同步

    const path = require('path');
    const fse = require('fs-extra')
    const Sequelize = require('sequelize');
    const dbPath = path.resolve(process.resourcesPath, 'databaseFolder')
    const dbFile = path.resolve(dbPath, 'database.sqlite')
    
    const sequelize = new Sequelize({
      dialect: 'sqlite',
      storage: dbFile
    })
    
    if (!fse.existsSync(dbPath)) {
      fse.ensureDirSync(dbPath)
      fse.ensureFileSync(dbFile)
      sequelize.sync({ force: true })
    }
    

    【讨论】:

      【解决方案3】:

      使用数据库文件的绝对地址

      示例:

      Linux:

      const path = "/home/brunodev/Documents/vscode/Git/backend/src/database/database.db"

      窗户:

      const path = "C:/Users/brunodev/Documents/vscode/Git/backend/src/database/database.db"

      【讨论】:

        猜你喜欢
        • 2016-03-19
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2020-07-03
        • 1970-01-01
        • 2020-05-28
        相关资源
        最近更新 更多