首页 > 解决方案 > Electron 和 Sqlite:SQLITE_NOTADB:文件不是数据库

问题描述

我尝试使用包含已经准备好的数据集的 sqlite 数据库构建一个 Electron.js 应用程序。我首先通过 sqlite3 命令创建了一个 stock.db 文件,然后以这种方式转储它:

sqlite3 股票.db .dump > 股票.sqlite

stock.sqlite 语法非常简单:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE "records" (
    "TICKER"    varchar(255) NOT NULL,
    "DAY"   varchar(155) NOT NULL,
    "TIME"  varchar(255) NOT NULL,
    "OPEN"  varchar(255) NOT NULL,
    "HIGH"  varchar(255) NOT NULL,
    "LOW"   varchar(255) NOT NULL,
    "CLOSE" varchar(255) NOT NULL,
    "VOL"   varchar(255) NOT NULL,
    "id"    int(11) NOT NULL
);
INSERT INTO "records" VALUES...
CREATE TABLE "symbols" (
    "id"    int(11) NOT NULL,
    "name"  varchar(50) NOT NULL,
    "symbol"    varchar(50) NOT NULL
);
INSERT INTO "symbols" VALUES...

然后我将此文件放入我的电子目录并尝试在我的代码中使用 knex 调用它:

const knex = require('knex')({
    client: "sqlite3",
    connection: {
        filename: "./stocks.sqlite"
    }
})

let resault = knex.select('symbol', 'name').from('symbols')
        resault.then(rows => {
            console.log(rows)
            win.webContents.send('resultSend', rows)
})
.catch(e => console.log(e))

然后我的系统无法将其识别为正确的 sqlite 文件:

[错误:选择symbolname来自symbols- SQLITE_NOTADB:文件不是数据库] { errno:26,代码:'SQLITE_NOTADB'}

我在这里做错了什么?我应该如何修复我的 .sqlite 文件以使我的应用程序可读。

标签: sqlsqliteelectronknex.js

解决方案


您正在从您的数据库创建 SQL 转储stocks.sqlite,而不是使用您之前创建的实际数据库文件。

如果要使用 knex 迁移创建新的 sqlite3 数据库,可以设置为使用一些不存在的文件并使用APIknex初始化表。knex.schema.*虽然使用预先创建的数据库就可以了。

我在您提到的评论中看到,应该使用database.sqlite命名文件。这也很好,只需将数据库二进制文件重命名为具有.sqlite扩展名。

从谷歌所有的文件信息页面似乎都提到这.sqlite实际上是二进制数据库文件,而不是纯 SQLite 兼容的文本.sql转储。

https://file.org/extension/sqlite http://www.manifold.net/doc/mfd9/sqlite.htm

尽管 sqlite3 文档不强制使用任何文件扩展名。除了为了最大的兼容性,他们提到名称中的 8+3 个字符是最好的。


推荐阅读