【问题标题】:Read SQLite database from the disk using sql.js使用 sql.js 从磁盘读取 SQLite 数据库
【发布时间】:2015-03-19 22:25:15
【问题描述】:

我可以在使用 - input type="file" 上传文件时读取文件,但我想从硬编码路径读取 SQLite 文件。 sql.js 的文档确实提供了如下所示的解决方案,但我无法使其正常工作。请帮忙。

var fs = require('fs');
var SQL = require('sql.js');
var filebuffer = fs.readFileSync('test.sqlite');
// Load the db
var db = new SQL.Database(filebuffer);
  • 我希望它非常简单,任何使用 sql.js 的人都可以回答这个问题。

【问题讨论】:

  • 您有任何错误吗?我假设您正在使用nodejs(readFileSync 和所有),所以您应该用那个标记问题
  • 您的文件在哪里?如果它不在当前路径中,则应给出确切路径。但我认为你已经这样做了,是吗?
  • 是的,sql.js 文档中提供的示例使用了 Node.js,但是有没有更简单的解决方案呢?可能只使用客户端脚本,因为我想在本地访问文件。

标签: javascript sqlite


【解决方案1】:

问题可能出在sql.jstest.sqlite 文件的位置。如果将它们保存在同一目录中,请将名称写为 './sql.js' './test.sqlite' 并带有点和斜线:

var fs = require('fs');
var SQL = require('./sql.js');
var data = fs.readFileSync('./Chinook_Sqlite.sqlite');
var sqldb = new SQL.Database(data);

我只是运行上面的代码,它在 Node.js (node test.js) 上运行良好。我的目录有以下文件:

  • test.js - 来自上述示例的文件
  • sql.js - 库文件
  • Chinook_Sqlite.sqlite - Chinook 测试数据库

更新 2 来自 SQL.js 的人员建议在最新版本的 SQL.js 中使用此代码(请参阅 SQL.js wiki):

var xhr = new XMLHttpRequest();
xhr.open('GET', '/path/to/database.sqlite', true);
xhr.responseType = 'arraybuffer';

xhr.onload = function(e) {
    var uInt8Array = new Uint8Array(this.response);
    var db = new SQL.Database(uInt8Array);
    var contents = db.exec("SELECT * FROM my_table");
    // contents is now [{columns:['col1','col2',...], values:[[first row], [second row], ...]}]
};
xhr.send();

UPDATE 1 如果需要在浏览器中打开 SQLite 文件,可以使用下面的代码(参见工作示例here):

<script src="sql.js"></script>
<script>
    function loadBinaryFile(path,success) {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", path, true); 
        xhr.responseType = "arraybuffer";
        xhr.onload = function() {
            var data = new Uint8Array(xhr.response);
            var arr = new Array();
            for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
            success(arr.join(""));
        };
        xhr.send();
    };

    loadBinaryFile('./Chinook_Sqlite.sqlite', function(data){
        var sqldb = new SQL.Database(data);
        // Database is ready
        var res = db.exec("SELECT * FROM Genre");
    });
</script>

【讨论】:

  • 问题是,我将以 Windows 形式自行托管这个 asp.net MVC 应用程序。我还能使用 node.js 吗?或者为了让事情更简单,有没有办法从客户端的硬编码文件路径中读取文件?
  • 1) 您可以使用 iisnode 包 (github.com/tjanczuk/iisnode) 在 ASP.NET 下托管 Node.js。 2)如果您想在客户端(在浏览器中)阅读 Sqlite,那么您需要不同的代码结构,例如示例 alasql.org/demo/016sqlite(我发布了新代码作为对此答案的更新):
  • 3) 如果您需要指定浏览器的服务器文件路径,您需要设置您的 HTTP 服务器(IIS 或 Node.js)以映射来自“http://mysite/mypath”的路径/myfile.sqlite”到您的服务器路径,例如“/myserverpath/path/path/myfile.sqlite”。此设置取决于您的网络服务器
  • 感谢您的回答,但我收到此错误:由于扩展配置,无法提供您请求的页面。如果页面是脚本,则添加处理程序。如果应该下载文件,请添加 MIME 映射。我能够读取纯文本文件。我该如何解决这个问题?
  • 但是当我执行与示例类似的操作时,我在 div 元素中得到了这个:{"filename":"dbfile_951670714","db":5287952,"Yb":{}},但是我无法读取 .sqlite 文件,因为它给出了上述错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2020-04-14
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多