pgrundev/pgx
PGX — Lightweight Postgres for AI agents. Written in Rust. Thousands of isolated databases in one runtime. 🐘
它是什么
PGX “Postgres for agents” 是一个数据库运行时,在单个进程内运行许多短期的、兼容 Postgres 的数据库。它使用 Postgres 的线协议和 SQL 方言,因此框架工具(Rails、Django、Prisma、SQLAlchemy、node-postgres)无需修改即可运行其完整的 migrate → test → schema-change 生命周期。
它解决的问题
今天,一个数据库意味着一个 PostgreSQL 服务器——一个进程、几十兆字节的内存,以及每次的冷启动。代理工作流、CI 作业、测试套件和预览环境会不断创建数据库,并在几分钟或几小时后将其丢弃。PGX 用不同的生命周期取代了这种模式:
密封模板 → 铸造数据库(毫秒级,写时复制) → 代理/CI/测试使用 → 丢弃
不是 1 个数据库 → 1 个 PostgreSQL 服务器,PGX 运行 1 个 PGX 运行时 → 数百或数千个隔离的数据库。
工作原理(主要思路)
- 共享所有不可变内容,仅为差异付费。 从同一模板克隆的所有数据库共享不可变状态——内存(目录缓存)和存储(未更改的块)都是如此。每个数据库主要为其差异部分付费。
- 共享运行时。 数据库在单个进程内通过名称、角色和限制进行隔离。一个数据库的成本是其目录缓存,而不是一个完整的服务器。
- 连接时铸造。 连接到像
<prefix><template>__<token>这样的特殊名称会从密封模板创建该数据库并连接到它。预热池提供预创建的空闲数据库以应对突发流量。 - 写时复制存储。 在 ZFS 文件系统上使用
file_copy_method = clone,10 GB 数据库的分支与其模板共享每个未更改的块——准备时间约 674 毫秒,仅需约 13.6 MB 的新物理存储。在没有块克隆的文件系统上,则是完整复制。 - 每个级别都有限制。 引擎内的会话、数据库和运行时内存限制,每个数据库的连接限制,以及围绕运行时的 Linux cgroup 作为最终后备。
关键测量数据
基准测试来自 PostgreSQL 自己的测试套件,以及一个具有 ZFS 块克隆的 4 vCPU / 8 GB Linux VPS(测试工具位于 benchmarks/)。所有数据均为描述的配置,并非声称普遍优越。
| 领域 | 数值 |
|---|---|
| 数据库创建(预热池,p50) | ~6.2 毫秒 |
| 每个未触碰的空闲数据库内存 | ~70 KB |
| 执行一次查询后每个空闲数据库的内存 | ~128 KB |
| 单个 4 vCPU / 8 GB 虚拟机上的数据库数量 | 1,000 |
| 1000 个未触碰数据库的总运行时内存 | 128–155 MB |
PostgreSQL src/test/regress(PG 18.6 预期输出) |
219 / 231 字节完全匹配;0 个结果差异(12 个仅在 EXPLAIN 计划文本上有所不同) |
| 框架运行(Rails 8.1、Django 5.2、Prisma 6、SQLAlchemy 2、node-postgres) | 36 / 36 通过 |
| 10 GB 模板的分支(ZFS 克隆) | 准备时间约 674 毫秒,新增存储约 13.6 MB |
| 长期轮换:30,000 次创建→使用→丢弃生命周期 | 总运行时内存约 111 MB |
| 查询速度对比 PostgreSQL 18 | 短语句慢约 0.05–0.15 毫秒;大型单线程扫描慢 1.5–2.2 倍;COPY 和 4 客户端吞吐量相同 |
PGX 并不试图在单个查询上超越 Postgres——它的优势在于创建延迟、密度、内存效率、写时复制存储、高轮换率以及每租户隔离。
它不是(v0.1 限制)
README 明确说明:PGX v0.1 用于一次性数据库(代理、CI、PR、测试、预览),这些数据库由生产环境的净化副本构建。它不是生产主库、记录系统或 HA/PITR。具体差距:
- 不具备崩溃安全性 — 该配置文件使用
fsync = off运行。 - 单进程 — 一个运行时是一个故障域。
- 无 C 扩展 — 无法加载 PostgreSQL C 扩展;仅内置 contrib 模块(包括 pgvector)。PL/Python、PL/Perl、PL/Tcl 不可用。
- 它处于 0.1.0 版本,是一个早期版本。
快速开始
一条命令即可安装、启动、创建 app 数据库,并打印连接 URL:
npx pgxdb@latest
然后将 DATABASE_URL 指向打印出的 URL。其他 CLI 命令(可通过 npx pgxdb <cmd> 或全局安装后的 pgx 使用):
pgx clone app agent-001 --ttl 5m # 5 分钟写时复制分支
pgx ls # 数据库、TTL、过期时间、大小
pgx create scratch --ttl 2h # 自动删除的一次性数据库
pgx ttl pr-123 unlimited # 更改分支的 TTL
pgx stop # 停止运行时
未使用 --ttl 创建的数据库是永久的;后台管理器会在临时数据库到期后将其丢弃,并在重启后恢复清理。二进制文件经过 SHA-256 验证并缓存于 ~/.pgx/dist/<version>。无需 Docker — 原生支持 Mac(Apple 芯片)和 Linux(arm64、x86-64);不支持 Intel Mac。Shell 安装脚本(curl -fsSL https://pgx.dev/install | sh)可在无 Node 环境下使用。
与 PGRun 的关系
PGX 是 PGRun 中 PGX 分支背后的数据库引擎。PGRun 在其周围添加了控制平面——编排、路由、模板、生命周期、访问、分支管理、自动过期——而 PGX 是运行时。它们是独立的项目。
项目状态与贡献指南
项目表示正确性和可复现性优先于基准测试营销。它追踪 PostgreSQL 兼容性、Rails/应用程序兼容性、并发语义、生命周期正确性、资源隔离以及真实的代理工作负载。最有用的贡献是一个具体的兼容性案例:一个问题,包含 PostgreSQL 版本、PGX 版本、最小 SQL 复现、预期和实际结果——尤其是涉及 MVCC、锁、死锁、隔离级别、事务性 DDL 和 ORM 的问题。
相关
- 项目
- 项目
- 项目
- 项目