2013-08-17 27 views
4

目前我使用的节点sqlite3的sqlite的我node-webkit桌面应用程序结合,并用它作为连接sequelize.js使用节点,WebKit的桌面应用程序源码

var sqlite3 = require('node_sqlite3').verbose(); 
var db = new sqlite3.Database('file:data.db'); 
db.run(query); 

和我所知,这本地编译节点的sqlite3是与node-webkit一起使用sqlite db的唯一方法。

现在我想用在应用sequelize,其通常被用作:

var Sequelize = require('sequelize-sqlite').sequelize 
var sqlite = require('sequelize-sqlite').sqlite 
var sequelize = new Sequelize('database', 'username', 'password', { 
dialect: 'sqlite', 
storage: 'path/to/database.sqlite' 
}) 
sequelize.query("SELECT * FROM myTable").success(function(myTableRows) { 
console.log(myTableRows) 
}) 

我怎么能做到这一点? (即使用node-webkit应用程序和sqlite使用sequelize)

目标是通过运行迁移,使用模型来操作数据库或者建议是否存在任何其他JavaScript库(mvc是首选) ,它可以通过node-webkit + sqlite(以及如何使它们工作)工作。

是angularjs的一个选项?如果是的话,该怎么做。

谢谢。

回答

3

我找到了解决方案。使用以下sqlite3的节点,WebKit和重建它作为

node sqlite 3 for node-webkit
后它创建了一个名为“node_sqlite3”的node_modules文件夹里面。我将“node_sqlite3”更名为“sqlite3”。然后做了npm-install的sequelize-sqlite。
此sequelize-sqlite自动识别并连接到sqlite3,它可以正常使用。

var Sequelize = require('sequelize-sqlite').sequelize 
var sqlite = require('sequelize-sqlite').sqlite 

var sequelize = new Sequelize('database', 'username', '', { 
dialect: 'sqlite', 
storage: 'file:data.db' 
}) 

var Record = sequelize.define('Record', { 
name: Sequelize.STRING, 
quantity: Sequelize.INTEGER 
}) 

sequelize.sync() 
.success(function(){ 
console.log('synced') 
}) 

var rec = Record.build({ name: "sunny", quantity: 3 }); 
rec.save() 
.error(function(err) { 
// error callback 
alert('somethings wrong') 
}) 
.success(function() { 
// success callback 
console.log('inserted') 
}); 

并且记录在数据库中。

+0

我正在做一个类似的项目,在node-webkit应用程序中使用Sequelize + sqlite3。关于定义'sequelize'实例,'storage'选项的相对路径是什么?相对于应用程序根目录('package.json'和'index.html'),数据库去了哪里? –

+0

@MikeTrpcic我仍在开发应用程序,所以目前sqlite数据库是在应用程序文件夹内,但它必须在压缩的应用程序之外,一旦它完成,无法找到它,肯定会共享,如果我找到一种方法。 – sunnyvilles

+0

我做了你说的,我得到这个错误= S'“未捕获的错误:无法找到模块'./binding/Release/node-v11-darwin-ia32/node_sqlite3.node'”,来源:module.js( 343)“有什么想法? – mariowise

0

在Node-WebKit中,您可以使用完全用JavaScript编写的模块。对于包含C/C++的模块,您应该使用node-gyp构建插件,因为node-webkit的ABI(应用程序二进制接口)与Node的ABI不同。

尝试像水木清华sequelize-sqlite 100%JS或找到模块NPM去它的GitHub库和下排提交,分支,释放&贡献者点击有色排“显示语言统计”。

+0

我只能使用node-sqlite3,因为我已经通过node-gyp构建了它,并且我已经使用sequelize-sqlite来说明问题。无论如何,谢谢你的回答。 – sunnyvilles

1

我也有一个连接到SQLite数据库从node-webkit使用sequelize的问题。通过反复试验,我得到了以下解决方案。

var Sequelize = require('sequelize'); 
var sequelize = new Sequelize('sqlite:mydb.sqlite3', { 
    dialect: 'sqlite', 
    storage: './mydb.sqlite3' 
}); 

sequelize.query("SELECT * FROM tableName", { type: db.QueryTypes.SELECT }) 
.then(function(result) { 
    console.log(result); 
}) 
.catch(function (e) { 
    console.log(e); 
}); 

注意,对于SQLite数据库,你必须指定

storage: './mydb.sqlite3' 

这是通向你的数据库文件。它可以是绝对路径或相对路径。 ./表示package.json所在的项目根文件夹。

另外,连接字符串必须包含前缀sqlite:。否则,它会引发一个异常:Cannot read property 'replace' of nullsqlite:前缀后面的部分是不相关的,甚至可以省略,因为在storage选项中指定了实际的数据库位置。 dialect选项也可以省略,因为在连接字符串前缀中提到了db类型。所以,你可以使用

var sequelize = new Sequelize('sqlite:', { 
    storage: './mydb.sqlite3' 
}); 

还值得一提的是,.success.error方法已过时连接简单。在写这篇文章时,Sequelize(3.21)的最新版本使用.then方法来处理承诺被执行时的操作,如果承诺被拒绝,则使用.catch方法。

相关问题