使用 Javascript 直接在浏览器中读取 Sqlite3 的最佳方法是啥?

Posted

技术标签:

【中文标题】使用 Javascript 直接在浏览器中读取 Sqlite3 的最佳方法是啥?【英文标题】:What's the best way to read Sqlite3 directly in Browser using Javascript?使用 Javascript 直接在浏览器中读取 Sqlite3 的最佳方法是什么? 【发布时间】:2013-01-23 18:06:54 【问题描述】:

对于我们的 Insights 平台之一,我们计划在后台生成汇总 SQLite3 数据库,并让它在浏览器上呈现为图表。目前,我们打算创建一个服务于数据需求的服务器端端点。

我们希望通过完全消除服务器端端点来进一步优化这一点。我们可以(从安全角度来看)直接在 S3 上公开 SQLite3 并让 javascript 模块读取并生成图表。

SQLite3 文件预计相当小——可能有 4-6 列,可能有 10-500 行数据,并且所有这些文件都只包含一个表。测试运行表明文件大小小于 15KB。 我们不打算在浏览器上编写或操作 SQLite3。 我们不需要将其作为 WebSQL 或 IndexedDB 表单缓存在浏览器上,但如果需要,我们可以使用它们。

从我的网络搜索中,我们找不到可以读取 SQLite3 文件并查询结果的 Javascript 库。如果您知道任何可以执行此操作的 javascript 库,请告诉我们。

另一方面,如果您认为我们不应该出于某种原因这样做,那么也请把它们作为 cmets/answers 扔掉,因为这是我们第一次尝试的东西,而且似乎有点过时-开箱即用,欢迎提供反馈!

【问题讨论】:

这不能通过 JavaScript 直接完成 - 但是,WebSQL/IndexedDB可能在下面使用 SQLite;但这是一个实现细节。 (在大多数情况下,SQLite 需要进程内访问 [本地] 文件系统。) .. 我无法想象一个可以在 JavaScript 中读取 SQLite 数据(例如仅在内存数据中)的数据库引擎的完全重写会非常实用,但是I've been surprised before. @pst 关于您的第一个评论,是的,我知道他们可能在下面使用 SQLite,但从我们这边来看,必须从服务器获取它并与 WebSQL/IndexedDB 同步似乎太麻烦了并且难以长期维持。 我认为[目前]浏览器上最好的选择是 WebSQL/IndexedDB,具体取决于目标浏览器。传输初始场景/数据应该不会花很长时间。或者,可以将所有内容作为适当的 [去] 规范化 JSON 发送回来 - JSON 最初可能更简单,但会最大限度地减少执行“临时”查询的能力,就像文档数据库一样。 除非您为不同的浏览器创建插件或扩展,否则您将无法做到这一点,sqlite 作为 web sql 提供,但很快就会被弃用,因为它被 IndexedDB(纯 JSON)取代基于数据库。根据我的经验,使用设备或客户端处理数据会产生不利影响,IE不支持这些,在移动设备上存在难以检测的错误,并且无法轻松升级。我去过那里,我们最终把所有东西都放在app-server上,将app server划分为api server,调用单个组件很容易而不是调试和支持客户端 【参考方案1】:

有一个名为sql.js 的javascript 库可以完全满足您的需求。在你的情况下,你会这样使用它

const SQL = await initSqlJs(options);
const fetched = await fetch("/path/to/database.sqlite");
const buf = await fetched.arrayBuffer();
const db = new SQL.Database(new Uint8Array(buf));
const contents = db.exec("SELECT * FROM my_table");
// contents is now [columns:['col1','col2',...], values:[[first row], [second row], ...]]

请参阅sql-js.github.io/sql.js/documentation/ 上的文档

【讨论】:

+10。这就是解决方案。 lovasoa 的提交已合并到原始 sql.js 中,请在 github.com/kripken/sql.js 获取。上面的例子只需要修改一种方式:在顶部添加var SQL = window.SQL;(当然是在包含sql.js文件并更改my_table之后)。效果很好(我用的是 Chrome)。 如何插入新记录或更新表中的记录?【参考方案2】:

我不能说最好,但有一个:自己编写一个 JavaScript SQLite 阅读器库。这将是一项乏味的任务,但我确信它可以完成。一些很酷的人已经完成了pdf.js,这是一个用于 PDF 文件的 JavaScript 渲染器,它也是二进制 BLOB,就像SQLite files 一样。

您很可能会从 FileReader API 开始遍历 SQLite 文件,然后创建一些内存中的内容表示,供您的图表工具使用。

免责声明:您可能希望使用其他人提出的另一种解决方案来解决您最初的问题,但这回答了您的问题。

【讨论】:

我接受@Marcel 的回答,因为目前似乎没有更好的答案(对于客户端 JS)。 @Shreeni 你看过@Prinzhorn 提出的sql.js 吗?这似乎很有希望。 我查看了 sql.js 库,但文档似乎很少。谁能指出任何好的实际例子?特别是,我想知道是否可以使用 ajax 调用从服务器获取一个 sqlite 文件并使用 sql.js 查询它 这不再是正确的答案。请参阅 lovasoa 对现在记录良好的 sql.js 的回答。

以上是关于使用 Javascript 直接在浏览器中读取 Sqlite3 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何用javascript操作本地文件

如何使用 JavaScript 在 NativeScript 中读取 CSS 变量

JavaScript语言学习中的注意事项

javascript在浏览器中调用sqlserver数据

使用 Selenium WebDriver 读取 JavaScript 变量

如何使用 JavaScript 读取 HttpOnly cookie