--- 摄于 2017 年 9 月 藏川线前段
这算是 ckb on wasm 的番外篇,之前系列看过的朋友都知道,lightclient 的浏览器存储选择用了 indexeddb,但实际上另一个 opfs 也是可用的,并且浏览器端也不仅仅只有 kv 数据库模型,还有很多可选项,不过一个比一个抽象,比如这篇介绍的,我已经测通了在浏览器端使用 sqlite 的语法和功能建立一个类 sqlite 的关系型数据库模型,并且使用 rust 在 wasm 中操作,相关 demo 可查询自取。
基本上在早期,刚接触数据库的时候,大部分朋友都会面对 mysql/oracle/postgrasql 这类关系型数据库,后续才陆续接触到类似 redis 这种 kv 型数据库/influxdb 这种时序数据库/Mongodb 这种图数据库,然后又会了解到所谓的 Embedded Database 与 S-C 架构的数据库区别,一堆花样等着你来挑战。
那么在浏览器端,如果想用关系型数据库怎么办,在不远的过去,可能会用各种奇淫巧技去解决它,比如,用 websocket 连出,然后做个代理,将 websocket 的数据转发到对应数据库中,或者比如用 js 模拟对应的接口,然后最后实现落盘的时候,放到对应的远端/浏览器接口(indexeddb)上。而当 WebAssembly 这种技术出现之后,如 sqlite 这种嵌入式数据库,就可以使用 wasm target 做成真正能运行在浏览器上的关系型数据库了。在这个网页 sqlite 有官方直接发布的 wasm 和对应的 js 胶水代码。同时它还支持几个不同的版本,包括完全支持的使用 opfs 作为存储对象的、纯内存操作的、支持大数特性的等等。
官方释出的 js 代码其实不是很好用,实话,我看过了,脑壳疼,原本我是打算从它的 js 代码里面找到对应的 wasm 源码接口,然后用 rust 直接加载 sqlite-wasm,然后 rust 就可以直接调用 sqlite-wasm 里的东西了,看过它 js 代码之后,我觉得,可能有点草率了,虽然理论上来说,这种方式是性能最优的选择,但是,工作量不是一两周的问题。
于是,发现了 sqljs 这种项目,它算是原版封装的上层封装,然后导出了一个比较亲民化的 js api 版本。然后,我又一次不信邪,尝试看一下代码,发现可能还是有点草率了。于是破罐子破摔,看看能不能直接做 sqljs 的 rust bind,然后我发现,它把所有类型都封装到了一个 module 里面,然后把这个 module 放在了 window 下,rust 的 wasm-bindgen 抓不到类型,要重新导出来才行。于是就有了我代码仓库里面的 sql.js 的封装,实际上就是一个导出工作而已。
这样我们就得到了一个极其初步的 rust crate,它的编译目标是 wasm,功能是在 wasm 里面用操作 sqlite
的方式来存储数据,并且支持导出所有数据。它的原理是,rust bind js bind wasm(非常抽象)。
等我尝试完成之后,发现其实有人这么干过,只是它是用 js 写的,思路是一样的,都是通过 bind sqljs 这个库来实现,只是他做得相对完善很多。而我的尝试只是做了最基础的部分,中间还缺一大块就是类似 orm 的数据类型转换,不过验证的目的已经完成了,后续如果真的有需求再考虑怎么往下做吧。
请登录后评论
评论区
加载更多