Electron and sequelize error: the dialect sqlite is not supported
Electron and sequelize error: the dialect sqlite is not supported
我正在尝试在桌面应用程序中使用 sequelize and sqlite with electron,但是当通过 npm start
(其中 运行s node_modules/.bin/electron .
):
Uncaught Error: The dialect sqlite is not supported. (Error: Please install sqlite3 package manually)
我用 npm install --save sequelize sqlite
安装了 sequelize 和 sqlite。当我直接通过 node models.js
运行 模型文件时,一切正常:
$ node models.js
Executing (default): CREATE TABLE IF NOT EXISTS `Users` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `username` VARCHAR(255), `birthday` DATETIME, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);
Executing (default): PRAGMA INDEX_LIST(`Users`)
Executing (default): INSERT INTO `Users` (`id`,`username`,`birthday`,`updatedAt`,`createdAt`) VALUES (NULL,'janedoe','1980-07-19 22:00:00.000 +00:00','2015-09-06 11:18:52.412 +00:00','2015-09-06 11:18:52.412 +00:00');
{ id: 1,
username: 'janedoe',
birthday: Sun Jul 20 1980 00:00:00 GMT+0200 (CEST),
updatedAt: Sun Sep 06 2015 13:18:52 GMT+0200 (CEST),
createdAt: Sun Sep 06 2015 13:18:52 GMT+0200 (CEST) }
所以问题是特定于使用 electron 的 sequelize。所有文件如下所示。
package.json
{
"name": "example",
"version": "0.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "node_modules/.bin/electron .",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"devDependencies": {
"electron-prebuilt": "^0.31.1"
},
"dependencies": {
"jquery": "^2.1.4",
"sequelize": "^3.7.1",
"sqlite3": "^3.0.10"
}
}
app.js
var app = require('app');
var BrowserWindow = require('browser-window');
require('crash-reporter').start();
var mainWindow = null;
app.on('window-all-closed', function() {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('ready', function() {
mainWindow = new BrowserWindow({width: 800, height: 600});
mainWindow.loadUrl('file://' + __dirname + '/index.html');
mainWindow.on('closed', function() {
mainWindow = null;
});
});
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Required meta tags always come first -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
</head>
<body>
<p>Example</p>
<script src="models.js"></script>
</body>
</html>
models.js
var Sequelize = require('sequelize');
var sequelize = new Sequelize('bdgt', 'username', 'password', {
dialect: 'sqlite',
storage: 'example.db',
});
var User = sequelize.define('User', {
username: Sequelize.STRING,
birthday: Sequelize.DATE
});
sequelize.sync().then(function() {
return User.create({
username: 'janedoe',
birthday: new Date(1980, 6, 20)
});
}).then(function(jane) {
console.log(jane.get({
plain: true
}));
});
使用 npm install
安装依赖项并使用 npm start
重现问题。 运行 node models.js
将单独展示续集作品。
基于@Josh 和其他博客 posts 提供的文章和问题讨论,我终于找到了解决这个问题的有效方法。下面我写了我为解决这个问题所采取的所有步骤。 最终解决方案 已发布os在此答案底部
我遵循了 electron repo 中提供的电子教程。
简单的方法
我已经安装了 electron-rebuild
节点包和 运行 ./node_modules/.bin/electron-rebuild
这给了我以下错误:
node-pre-gyp ERR! install error
node-pre-gyp ERR! stack Error: Unsupported target version: 0.31.2
node-pre-gyp ERR! command "node" "/my/project/dir/node_modules/sqlite3/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! not ok
npm ERR! Failed at the sqlite3@3.0.10 install script 'node-pre-gyp install --fallback-to-build'.
npm ERR! This is most likely a problem with the sqlite3 package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node-pre-gyp install --fallback-to-build
node-gyp 之道
我已经全局安装了 node-gyp 模块并进入 ./node_modules/sqlite3
目录。然后我尝试 运行 以下命令:
node-gyp rebuild --target=0.31.2 --arch=x64 --dist-url=https://atom.io/download/atom-shell
并出现以下错误:
gyp: Undefined variable module_name in binding.gyp while trying to load binding.gyp
npm 之道
这导致了与简单方法相同的结果。
sqlite3 forks
最后我试着下载了几个sqlite3 forks。不幸的是结果是一样的。
最后的尝试-解决方案
@Josh 提供的博客 post 被禁止访问,但我找到了 google cached version of it. I also followed the discussion of the electron issue.
下面介绍的步骤应该会让您获得一个有效的 sqlite3 包。
- 更改 package.json
"electron-prebuilt": "0.29.1"
中预建的电子版本
- 重新安装
electron-prebuilt
- 将目录更改为
./node_modules/sqlite3
- 运行 预发布脚本
npm run prepublish
配置 node-gyp module_name 和 module_path
node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/node-v44-linux-x64
重建包
node-gyp rebuild --target=0.29.1 --arch=x64 --target_platform=linux --dist-url=https://atom.io/download/atom-shell --module_name=node_sqlite3 --module_path=../lib/binding/node-v44-linux-x64
我尝试使用版本为 0.31.2 的 electron-prebuilt 包进行编译,但由于某种原因失败了。
如果您使用的是 mac,请将 linux
替换为 darwin
。
如果您的 os 架构是 32 位,请将 x64
替换为 ia32
如果你可以 运行 $npm list sqlite3
你会得到这样的回复...
MyAppName@0.0.1 /path/to/MyApp
└── sqlite3@3.0.10
那么问题很可能是 sqlite3 在 Electron 中不起作用(没有一些强制转换)并且 Sequelize 不知道如何表达错误。
请参阅 this blog post 让 sqlite3 在 Electron 中工作。这应该可以解决您的 Sequelize 问题。
我知道您安装了 sqlite3
并单独工作,但是当您尝试将 sqlite3
与 electron
一起使用时会出现问题。这是因为ABI版本不匹配。
当你把一个
console.log(err);
在
<project>/node_modules/sequelize/lib/dialects/sqlite/connection-manager.js
第 21 行,
就在 throw new Error('Please install sqlite3 package manually');
之前,您将看到如下错误:
{ [Error: Cannot find module '<full_path_to_project>/node_modules/sqlite3/lib/binding/node-v44-linux-x64/node_sqlite3.node'] code: 'MODULE_NOT_FOUND' }
然而,当您检查 /node_modules/sqlite3/lib/binding/
文件夹时,不会有 node-v44-linux-x64
文件夹,而是 node-v11-linux-x64
文件夹之类的东西。 (简单地重命名文件夹是行不通的。)
发生这种不匹配是因为 electron 在内部使用 io.js v3.1.0
,因为它声明 here 并且它的 ABI 版本与您的 nodejs 版本不匹配。
请注意,node-vXX
由节点的 ABI 版本决定。检查此 url 以获取更多信息:https://github.com/mapbox/node-pre-gyp/issues/167
解决方案
此处所述的简单方法 https://github.com/atom/electron/blob/master/docs/tutorial/using-native-node-modules.md#the-easy-way 不适用于 sqlite
,但您可以按照以下步骤使其工作:
通过以下命令安装 electron-rebuild
后
npm install --save-dev electron-rebuild
转到 <project path>/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/abi_crosswalk.js
并找到您的节点版本,然后将 node_abi
值更改为 44
。喜欢以下内容:
"0.12.7": {
"node_abi": 44,
"v8": "3.28"
},
然后给出./node_modules/.bin/electron-rebuild
命令并稍等。然后就可以了。
我 运行 多次遇到此错误,对我有用的解决方案是安装 electron-rebuild
,然后 运行:
electron-rebuild -w sqlite3 -p
此处的 -p
标志是必需的,因为 sqlite3 使用 node-pre-gyp。
我正在尝试在桌面应用程序中使用 sequelize and sqlite with electron,但是当通过 npm start
(其中 运行s node_modules/.bin/electron .
):
Uncaught Error: The dialect sqlite is not supported. (Error: Please install sqlite3 package manually)
我用 npm install --save sequelize sqlite
安装了 sequelize 和 sqlite。当我直接通过 node models.js
运行 模型文件时,一切正常:
$ node models.js
Executing (default): CREATE TABLE IF NOT EXISTS `Users` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `username` VARCHAR(255), `birthday` DATETIME, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);
Executing (default): PRAGMA INDEX_LIST(`Users`)
Executing (default): INSERT INTO `Users` (`id`,`username`,`birthday`,`updatedAt`,`createdAt`) VALUES (NULL,'janedoe','1980-07-19 22:00:00.000 +00:00','2015-09-06 11:18:52.412 +00:00','2015-09-06 11:18:52.412 +00:00');
{ id: 1,
username: 'janedoe',
birthday: Sun Jul 20 1980 00:00:00 GMT+0200 (CEST),
updatedAt: Sun Sep 06 2015 13:18:52 GMT+0200 (CEST),
createdAt: Sun Sep 06 2015 13:18:52 GMT+0200 (CEST) }
所以问题是特定于使用 electron 的 sequelize。所有文件如下所示。
package.json
{
"name": "example",
"version": "0.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "node_modules/.bin/electron .",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"devDependencies": {
"electron-prebuilt": "^0.31.1"
},
"dependencies": {
"jquery": "^2.1.4",
"sequelize": "^3.7.1",
"sqlite3": "^3.0.10"
}
}
app.js
var app = require('app');
var BrowserWindow = require('browser-window');
require('crash-reporter').start();
var mainWindow = null;
app.on('window-all-closed', function() {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('ready', function() {
mainWindow = new BrowserWindow({width: 800, height: 600});
mainWindow.loadUrl('file://' + __dirname + '/index.html');
mainWindow.on('closed', function() {
mainWindow = null;
});
});
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Required meta tags always come first -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
</head>
<body>
<p>Example</p>
<script src="models.js"></script>
</body>
</html>
models.js
var Sequelize = require('sequelize');
var sequelize = new Sequelize('bdgt', 'username', 'password', {
dialect: 'sqlite',
storage: 'example.db',
});
var User = sequelize.define('User', {
username: Sequelize.STRING,
birthday: Sequelize.DATE
});
sequelize.sync().then(function() {
return User.create({
username: 'janedoe',
birthday: new Date(1980, 6, 20)
});
}).then(function(jane) {
console.log(jane.get({
plain: true
}));
});
使用 npm install
安装依赖项并使用 npm start
重现问题。 运行 node models.js
将单独展示续集作品。
基于@Josh 和其他博客 posts 提供的文章和问题讨论,我终于找到了解决这个问题的有效方法。下面我写了我为解决这个问题所采取的所有步骤。 最终解决方案 已发布os在此答案底部
我遵循了 electron repo 中提供的电子教程。
简单的方法
我已经安装了 electron-rebuild
节点包和 运行 ./node_modules/.bin/electron-rebuild
这给了我以下错误:
node-pre-gyp ERR! install error
node-pre-gyp ERR! stack Error: Unsupported target version: 0.31.2
node-pre-gyp ERR! command "node" "/my/project/dir/node_modules/sqlite3/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! not ok
npm ERR! Failed at the sqlite3@3.0.10 install script 'node-pre-gyp install --fallback-to-build'.
npm ERR! This is most likely a problem with the sqlite3 package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node-pre-gyp install --fallback-to-build
node-gyp 之道
我已经全局安装了 node-gyp 模块并进入 ./node_modules/sqlite3
目录。然后我尝试 运行 以下命令:
node-gyp rebuild --target=0.31.2 --arch=x64 --dist-url=https://atom.io/download/atom-shell
并出现以下错误:
gyp: Undefined variable module_name in binding.gyp while trying to load binding.gyp
npm 之道
这导致了与简单方法相同的结果。
sqlite3 forks
最后我试着下载了几个sqlite3 forks。不幸的是结果是一样的。
最后的尝试-解决方案
@Josh 提供的博客 post 被禁止访问,但我找到了 google cached version of it. I also followed the discussion of the electron issue.
下面介绍的步骤应该会让您获得一个有效的 sqlite3 包。
- 更改 package.json
"electron-prebuilt": "0.29.1"
中预建的电子版本
- 重新安装
electron-prebuilt
- 将目录更改为
./node_modules/sqlite3
- 运行 预发布脚本
npm run prepublish
配置 node-gyp module_name 和 module_path
node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/node-v44-linux-x64
重建包
node-gyp rebuild --target=0.29.1 --arch=x64 --target_platform=linux --dist-url=https://atom.io/download/atom-shell --module_name=node_sqlite3 --module_path=../lib/binding/node-v44-linux-x64
我尝试使用版本为 0.31.2 的 electron-prebuilt 包进行编译,但由于某种原因失败了。
如果您使用的是 mac,请将 linux
替换为 darwin
。
如果您的 os 架构是 32 位,请将 x64
替换为 ia32
如果你可以 运行 $npm list sqlite3
你会得到这样的回复...
MyAppName@0.0.1 /path/to/MyApp
└── sqlite3@3.0.10
那么问题很可能是 sqlite3 在 Electron 中不起作用(没有一些强制转换)并且 Sequelize 不知道如何表达错误。
请参阅 this blog post 让 sqlite3 在 Electron 中工作。这应该可以解决您的 Sequelize 问题。
我知道您安装了 sqlite3
并单独工作,但是当您尝试将 sqlite3
与 electron
一起使用时会出现问题。这是因为ABI版本不匹配。
当你把一个
console.log(err);
在
<project>/node_modules/sequelize/lib/dialects/sqlite/connection-manager.js
第 21 行,
就在 throw new Error('Please install sqlite3 package manually');
之前,您将看到如下错误:
{ [Error: Cannot find module '<full_path_to_project>/node_modules/sqlite3/lib/binding/node-v44-linux-x64/node_sqlite3.node'] code: 'MODULE_NOT_FOUND' }
然而,当您检查 /node_modules/sqlite3/lib/binding/
文件夹时,不会有 node-v44-linux-x64
文件夹,而是 node-v11-linux-x64
文件夹之类的东西。 (简单地重命名文件夹是行不通的。)
发生这种不匹配是因为 electron 在内部使用 io.js v3.1.0
,因为它声明 here 并且它的 ABI 版本与您的 nodejs 版本不匹配。
请注意,node-vXX
由节点的 ABI 版本决定。检查此 url 以获取更多信息:https://github.com/mapbox/node-pre-gyp/issues/167
解决方案
此处所述的简单方法 https://github.com/atom/electron/blob/master/docs/tutorial/using-native-node-modules.md#the-easy-way 不适用于 sqlite
,但您可以按照以下步骤使其工作:
通过以下命令安装 electron-rebuild
后
npm install --save-dev electron-rebuild
转到 <project path>/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/abi_crosswalk.js
并找到您的节点版本,然后将 node_abi
值更改为 44
。喜欢以下内容:
"0.12.7": {
"node_abi": 44,
"v8": "3.28"
},
然后给出./node_modules/.bin/electron-rebuild
命令并稍等。然后就可以了。
我 运行 多次遇到此错误,对我有用的解决方案是安装 electron-rebuild
,然后 运行:
electron-rebuild -w sqlite3 -p
此处的 -p
标志是必需的,因为 sqlite3 使用 node-pre-gyp。