从 JavaScript 访问和操作 sqlite 数据库的最佳建议。
10 回答
有一个名为sql.js
JavaScript 的 SQLite 端口的项目。
sql.js 是 SQLite 到 JavaScript 的一个端口,通过使用 Emscripten 编译 SQLite C 代码。
javascript SQLite解决方案全景图
在浏览器中
如果您想从 Web 浏览器中访问 SQLite 数据库,那么您没有很多解决方案。
sql.js
SQLite C 库已使用emscripten移植到 javascript。该端口是由 Alon Zakai(也是 emscripten 的作者)的名义启动的。我是这个库的当前维护者。sql.js
API 如下所示:
<script src='js/sql.js'></script>
<script>
//Create the database
var db = new SQL.Database();
// Run a query without reading the results
db.run("CREATE TABLE test (col1, col2);");
// Insert two rows: (1,111) and (2,222)
db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);
// Prepare a statement
var stmt = db.prepare("SELECT * FROM test WHERE a BETWEEN $start AND $end");
stmt.getAsObject({$start:1, $end:1}); // {col1:1, col2:111}
// Bind new values
stmt.bind({$start:1, $end:2});
while(stmt.step()) { //
var row = stmt.getAsObject();
// [...] do something with the row of result
}
</script>
网络 SQL
W3C 已经开始研究用于在浏览器中执行 SQL 的原生 API,称为web sql。该 API 的使用示例:
var db = openDatabase('mydb', '1.0', 'my first database', 2 * 1024 * 1024);
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS foo (id unique, text)');
tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "synergies")');
});
然而,该项目已被放弃。因此它没有得到广泛的支持。见:http ://caniuse.com/sql-storage
在节点
如果您在 node 中编写客户端 javascript,则您有更多选择。请参阅:https ://www.npmjs.org/search?q=sqlite 。
节点-sqlite3
如果您有一个编译工具链,并且不关心必须为不同平台(或仅针对一个平台)编译您的应用程序,我建议您使用node-sqlite3
. 它速度快(比 快得多sql.js
),具有完整的 API 和良好的文档。API 示例如下:
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database(':memory:');
db.serialize(function() {
db.run("CREATE TABLE lorem (info TEXT)");
var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
for (var i = 0; i < 10; i++) {
stmt.run("Ipsum " + i);
}
stmt.finalize();
db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
console.log(row.id + ": " + row.info);
});
});
db.close();
sql.js
是的,再次。sql.js
可以从节点使用。如果您想要一个纯 JavaScript 应用程序,这就是解决方案。但是,它会比以前的解决方案慢。
以下是如何sql.js
从节点使用的示例:
var fs = require('fs');
var SQL = require('sql.js');
var filebuffer = fs.readFileSync('test.sqlite');
db.run("INSERT INTO test VALUES (?,?,?)", [1, 'hello', true]); -- corrected INT to INTO
var data = db.export();
var buffer = new Buffer(data);
fs.writeFileSync("filename.sqlite", buffer);
好吧,如果您正在使用客户端 JavaScript,我认为您将不走运……浏览器倾向于将 JavaScript 环境沙箱化,因此您无法以任何一般能力访问机器,例如访问数据库。
如果您正在谈论从客户端访问的服务器端上的 SQLite DB,您可以设置一个 AJAX 解决方案,调用一些服务器端代码来访问它。
如果您在谈论 Rhino 或其他一些服务器端 JavaScript,您应该查看宿主语言的 API 访问 SQLite(例如 Rhino 的 JDBC)。
也许更澄清你的问题......?
Google Gears有一个内置的 sqlite 数据库——但如果你打算依赖它,你需要确保人们已经安装了它。
根据您的情况,您可能可以强制安装,否则您应该将其视为一个不错的选择,但要进行优雅的降级,以便该站点在未安装的情况下仍然可以工作。
如果您希望在浏览器(即客户端)上访问 SQLite 数据库,则需要您的浏览器来支持它。您可以使用 SpiderApe http://spiderape.sourceforge.net/plugins/sqlite/来实现,它假定浏览器是基于 Mozilla 的(即支持 SQLite)。您仍然需要允许访问底层库(http://www.mozilla.org/projects/security/components/signed-scripts.html)
如果您正在寻找从 Javascript 程序到 SQLite 数据库的服务器端访问,有几种选择: JSDB 是一种http://www.jsdb.org/;JSEXT 另一个http://jsext.sourceforge.net/;和 jslibs 另一个http://code.google.com/p/jslibs/
-- MV
sql.js库将使您能够在客户端调用 SQL 查询。使用该库,您可以通过调用 .open(data) 和 .exportData() 轻松地在服务器和客户端之间传输整个数据。这非常方便。
另外 HTML5 有存储能力,但是作为新技术标准,你不能假设所有的客户端都会支持。
如果您不使用 SQL, Lawnchair是一个非常好的选择,因为它提供了一种易于使用的键/值方法。这两个库为在客户端使用 sql 数据库提供了完整的解决方案。
另一个好的存储库是jStorage。它可用于保存客户端上“sql.js”中的数据。它支持多种浏览器(包括移动浏览器,以及 IE7 和 IE7 !),甚至可以在浏览器崩溃中幸存下来。
如果您在 Windows 中运行特权脚本(在 HTA 或 WSH 中),则可以使用“ADODB.Recordset”ActiveXObject 访问 ODBC 数据源。
如果您在网页上谈论客户端,那么上面的帖子回复:Google Gears 是您最好的选择。
您可以在 mozilla firefox 堆栈上使用 XUL API 执行它。这是一些关于它的教程: http ://www.arashkarimzadeh.com/articles/10-xul/25-sqlite-api-for-xul-application-using-javascript.html
在 Mac 上?看看 Gus Meuller 的 JSTalk,它利用了 Scripting Bridge 和 Patrick Geiller 的 JSCocoa。
Gus 在这里专门讨论了 Sqlite 支持:http: //gusmueller.com/blog/archives/2009/03/jstalk_extras.html ...效果很好。
JayData还提供了一个使用 JavaScript 与 sqLite/webSql 一起工作的工具包。你需要一个浏览器、Rhine 或 Nodejs 来运行这个东西。