电子和sequelize错误:方言sqlite不支持
我试图在桌面应用程序中使用电子的 sequelize和sqlite,但通过npm start
(运行node_modules/.bin/electron .
)运行应用程序时,出现以下错误:
未捕获的错误:方言sqlite不支持。 (错误:请手动安装sqlite3包)
我用npm install --save sequelize sqlite
安装了sequelize和sqlite npm install --save 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) }
所以这个问题是特定于使用电子续集的。 所有文件如下所示。
的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提供的文章以及其他博客post和问题讨论,find了解决这个问题的工作scheme。 下面我写了我为了解决这个问题而采取的所有步骤。 最终的解决scheme发布在这个答案的底部
我遵循电子回购的电子教程。
简单的方法
我已经安装了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
节点gyp的方式
我已经在全局安装了node- ./node_modules/sqlite3
模块,并input了./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方式
结果和The Easy Way一样。
sqlite3分叉
最后我试图下载sqlite3的几个叉子 。 不幸的是结果是一样的。
最后的尝试 – 解决scheme
@Josh提供的博客post对我来说是被禁止的,但是我发现它的谷歌caching版本。 我也跟着讨论了电子问题 。
下面介绍的步骤应该为你提供一个可用的sqlite3包。
- 改变电子版本在你的package.json
"electron-prebuilt": "0.29.1"
- 重新安装
electron-prebuilt
- 将目录切换到
./node_modules/sqlite3
- 运行预发布脚本
npm run prepublish
-
configurationnode-gyp module_name和module_path
node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/node-v44-linux-x64
-
重build包
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进行编译,但由于某种原因失败了。
如果你使用macreplacedarvin
linux
。
如果你的操作系统架构是32位用ia32
replacex64
我知道你已经安装了sqlite3
并单独工作,但是当你尝试与electron
一起使用sqlite3
时会出现问题。 这是因为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
文件夹。 (只需重命名该文件夹将不起作用。)
这种不匹配的发生是因为电子在内部使用io.js v3.1.0
因为它在这里指出它的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
命令并稍等一下。 然后它工作。
如果你可以运行$npm list sqlite3
,你会得到一个像…
MyAppName@0.0.1 /path/to/MyApp └── sqlite3@3.0.10
那么问题可能是,sqlite3不工作在电子(没有一些胁迫)和Sequelize不知道如何expression错误。
看到这个博客文章,以获得在Electron工作的sqlite3。 这应该解决你的问题与Sequelize。
我遇到了这个错误很多次,对我来说这个解决scheme是安装electron-rebuild
,然后运行:
electron-rebuild -w sqlite3 -p
-p
标志在这里是必需的,因为sqlite3使用node-pre-gyp。