PostgreSQL 全面拥抱 Wasm,PGlite 是否将大放异彩?

发表时间: 2024-03-08 06:20

家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

1.什么是 PostgreSQL

PostgreSQL 是一个功能强大的开源对象关系数据库系统,使用并扩展了 SQL 语言并结合了许多功能,可以安全地存储和扩展最复杂的数据工作负载。 PostgreSQL 的起源可以追溯到 1986 年,作为加州大学伯克利分校 POSTGRES 项目的一部分,并且在核心平台上拥有超过 35 年的积极开发经验。

PostgreSQL 因其经过验证的架构、可靠性、数据完整性、强大的功能集、可扩展性以及软件背后的开源社区始终如一的提供高性能和创新解决方案的奉献精神而赢得了良好的声誉。

2.什么是 PGlite

PGlite 是打包到 TypeScript 客户端库中的 WASM Postgres 构建,使开发者能够在浏览器、Node.js 和 Bun 中运行 Postgres,而无需安装任何其他依赖项,且 gzip 压缩后只有 3.7MB。

PGlite 可以用作临时内存数据库,或者持久保存到文件系统(Node / Bun)或 indexedDB(浏览器)。与之前的 “浏览器中的 Postgres” 项目不同,PGlite 不使用 Linux 虚拟机,只是 WASM 中的 Postgres。

同时,PGlite 是由 ElectricSQL 与 Neon 合作开发。 官方团队将继续在此实验的基础上进行构建,目标是创建一个功能齐全的轻量级 WASM Postgres,并支持 pgvector 等扩展。

目前 PGlite 在 Github 通过 MIT 协议开源,有超过 3.2k 的 star、是一个值得关注的前端开源项目

3.如何使用 PGlite

3.1 Node/Bun 环境中使用

首先需要安装相应依赖:

npm install @electric-sql/pglite

接着就可以使用内存中的 Postgres:

import {PGlite} from "@electric-sql/pglite";const db = new PGlite();await db.query("select'Hello world'as message;");// 输出内容值为 -> [{message: "Hello world"} ]

PGlite 还支持保存到文件系统:

const db = new PGlite("./path/to/pgdata");// Node/Bun运行时保存到文件系统

3.2 浏览器环境使用

可以通过 JSDeliver 或常用的包管理器加载,下面是在内存中使用 Postgres:

<script type="module">import {PGlite} from "https://cdn.jsdelivr.net/npm/@electric-sql/pglite/dist/index.js";const db = new PGlite()await db.query("select'Hello world'as message;")// -> 输出内容 [{message: "Hello world"} ]</script>

下面示例将数据库持久化到 indexedDB:

const db = new PGlite("idb://my-pgdata");// 持久化到indexedDB,浏览器支持indexedDB

3.3 Deno 中使用

要使用内存中的 Postgres,可以先创建文件 server.ts:

import {PGlite} from "npm:@electric-sql/pglite";Deno.serve(async (_request: Request) => {  const db = new PGlite();  const query = await db.query("select'Hello world'as message;");  return new Response(JSON.stringify(query));});

然后使用命令 deno run --allow-net --allow-read server.ts 运行该文件。

4.PGlite 局限性

PostgreSQL 通常使用进程分叉模型进行操作,即:每当客户端发起连接时,就会分叉一个新进程来管理该连接。 然而,使用 Emscripten(一种 C 到 WebAssembly (WASM) 编译器)编译的程序无法创建新进程,即严格在单进程模式下运行。 导致 PostgreSQL 无法直接编译为 WASM 进行常规操作。

幸运的是,PostgreSQL 包含一个 “单用户模式 (single user mode)”,主要用于引导和恢复过程期间的命令行使用。 在此功能的基础上,PGlite 引入了一种输入 / 输出路径,当 PostgreSQL 在 JavaScript 环境中编译为 WASM 时,可以促进与 PostgreSQL 的交互。

PGlite 局限性可以简单概括为两点:

  • 单用户 / 连接
  • 目前不支持参数化查询,但很快就会添加

参考资料

https://cn.theastrologypage.com/object-relational-database

https://www.postgresql.org/about/

https://dylibso.com/blog/pg-extism/

https://twitter.com/dieegosf/status/1760757150714880417