我尝试使用包含已准备好的数据集的sqlite数据库构建Electron.js应用程序。我首先通过sqlite3命令创建了一个stock.db文件,然后以这种方式将其转储:
sqlite3 stocks.db .dump > stocks.sqlite
stocks.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...
然后,将这个文件放到我的 Electron 目录中,并尝试使用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文件:[Error: select
symbol
,name
fromsymbols
- SQLITE_NOTADB: file is not a database] { errno: 26, code: 'SQLITE_NOTADB' }
我在这里做错了什么?我应该如何修复.sqlite文件以使其对我的应用程序可读。
最佳答案
您正在从数据库stocks.sqlite
创建SQL转储,而不是使用之前创建的实际数据库文件。
如果要通过knex迁移创建新的sqlite3 DB,则可以将knex
设置为使用一些不存在的文件,并使用knex.schema.*
API初始化表。虽然使用预先创建的数据库就可以了。
我在您提到的评论中看到,应该使用名为file的database.sqlite
。这也很好,只需将数据库二进制文件重命名为.sqlite
扩展名即可。
从Google来看,所有的fileinfo页面似乎都提到.sqlite
实际上是二进制数据库文件,而不是与SQLite兼容的纯文本.sql
转储。
https://file.org/extension/sqlite
http://www.manifold.net/doc/mfd9/sqlite.htm
尽管sqlite3 docs不会强制使用任何文件扩展名。除了为了最大的兼容性,他们提到名称中最好是8 + 3个字符。
关于sql - Electron 和Sqlite : SQLITE_NOTADB: file is not a database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63161867/