Postgres WASM开源项目可在浏览器内运行Postgres数据库

云计算数据库供应商Supabase协同开发工具开发商Snaplet,合作开发Postgres WASM开源项目,这是一个能够在浏览器运行PostgreSQL服务器的WebAssembly项目,该项目提供一套完整的功能,包括持久状态、从pg_dump恢复,以及从远程数据库进行逻辑复制等功能。

Postgres WASM以WebAssembly运行Postgres的想法并非原创,而是最先由Postgres服务供应商Crunchydata提出,不过Crunchydata的这个项目并非开源,因此Supabase和Snaplet便共同开发了一个开源版本。

Postgres WASM会在浏览器中启动一个虚拟机,来执行PostgreSQL服务器执行实例,开发团队使用v86模拟器在浏览器模拟执行x86操作系统,而v86运用x86虚拟化技术,即时将x86机器码转译为wasm。目前Postgres WASM还在初期阶段,其运行Postgres 14.5提供psql和pg_dump等工具,开发者可以利用Postgres WASM从文件复原状态,或是从IndexedDB等其他浏览器,存储和恢复Postgres状态,其他功能还有上传CSV文件到模拟器,或是从模拟器下载文件等。

官方提到,在浏览器以WASM执行Postgres的潜力很大,可以应用的场景很广,像是可用于教材文件,或是类似sql.js、absurd-sql等浏览器脱机缓存,用户也可以将其应用在脱机资料分析,或是在浏览器直接测试PostgresSQL函数、资料建模和逻辑复制等操作。

Postgres WASM也能被用于开发环境,从生产环境截取资料,或是将资料、函数推送到生产环境,用户甚至可以使用范例资料创建测试数据库后,再通过拍摄快照发送给其他开发者。

目前Postgres WASM存储库分为三个部分,分别是虚拟机、网页应用程序和网络代理。开发团队以Buildroot创建了一个可嵌入的虚拟机,并在虚拟机中内置安装Postgres的精简版Linux。

Postgres WASM则是通过WebAssembly在浏览器执行虚拟机的部分,而为了要让PgAdmin连接到Postgres,因此项目中加入网络代理,开发团队解释,由于浏览器阻止虚拟机访问TCP网络,因此必须通过websocket来代理流量,Postgres WASM执行Websockproxy,允许模拟器将websocket端口口发送的资料转换成TCP封包,并使其与网际网络通信。

现在的Postgres WASM并非一个纯WebAssembly实例,开发团队尝试要从源码直接利用WebAssembly编译Postgres,但是过程比预期复杂许多,因此折中做法便是在浏览器中虚拟化一台机器,通过v86在浏览器中模拟和x86兼容的CPU与硬件。

现阶段Postgres WASM容量约为30 mb,对于一般需要在浏览器执行Postgres的用例来说并不够好,Supabase和Snaplet正寻求更多的开发者贡献开源项目。