pgmicro 是一个进程内运行的 PostgreSQL 重新实现,底层由兼容 SQLite 的存储引擎支撑。它使用真正的 PostgreSQL 解析器(libpg_query)解析 PostgreSQL SQL,并直接将其编译为 SQLite VDBE 字节码,由 Turso 执行。最终得到一个快速、可嵌入、单文件(或内存中)且支持 PostgreSQL 语法的数据库,无需服务器进程。
用途 pgmicro 面向需要在应用进程内直接使用 PostgreSQL 语法的场景。它把 PostgreSQL 的解析能力与 SQLite 兼容的存储、可嵌入的运行时结合起来,适合作为嵌入式数据库或轻量级数据库使用。
主要能力
- 完整 PostgreSQL SQL 语法(通过实际的 PG 解析器)
- 兼容 SQLite 的 .db 文件格式(可被任何 SQLite 工具读取)
- JavaScript/TypeScript SDK(基于 WASM,可在 Node.js 和浏览器中运行)
- PostgreSQL 线协议服务器模式(可用 psql、ORM 等连接)
- 方言切换:以 PG 或 SQLite 语法访问同一数据库
- PostgreSQL 系统目录虚拟表(pg_class、pg_attribute、pg_type 等)
安装 CLI(Node.js):
免安装运行
npx pg-micro
全局安装
npm install -g pg-micro pg-micro myapp.db
JavaScript/TypeScript SDK: npm install pg-micro
从源码(Rust): git clone https://github.com/glommer/pgmicro cd pgmicro cargo build --release ./target/release/pgmicro
使用方式 CLI 用法:
内存数据库(临时)
pgmicro
基于文件的数据库
pgmicro myapp.db
PostgreSQL 线协议服务器
pgmicro myapp.db --server 127.0.0.1:5432
内存服务器(适合测试)
pgmicro :memory: --server 127.0.0.1:5432
CLI 元命令:? 显示帮助,\q 退出,\dt 列出表,\d <table> 描述表结构。
JavaScript/TypeScript SDK 基本用法:用 import { connect } from "pg-micro" 连接 ":memory:" 或文件路径;支持 db.exec 执行 DDL/DML、db.prepare 创建预编译语句并 all/get/run 取行或绑定参数执行、db.close 关闭。参数化查询支持 $1、$2 等占位符。事务可用 BEGIN/COMMIT/ROLLBACK 手动管理。TypeScript 中可通过泛型为预编译语句指定结果类型,例如 db.prepare<User>。
服务器模式与 psql / ORM:启动 pgmicro myapp.db --server 127.0.0.1:5432 后,可用 psql -h 127.0.0.1 -p 5432 -U turso -d main 连接,也可用 libpq 连接串(如 postgresql://turso@127.0.0.1:5432/main)连接;node-postgres(pg)客户端可指定 host、port、user、database 后正常查询。
架构概述 PostgreSQL SQL → libpg_query(真正的 PG 解析器)→ PG 解析树 → 翻译器(parser_pg/)→ Turso AST → Turso 编译器 → VDBE 字节码 → 字节码引擎(vdbe/)→ SQLite B-tree 存储(.db 文件)。生成的 .db 文件是标准 SQLite 数据库,可用 DB Browser for SQLite、sqlite3 CLI 或任意 SQLite 库打开。PostgreSQL 系统目录表(pg_class、pg_attribute、pg_type、pg_namespace)以虚拟表形式暴露,使 psql 的 \dt、\d 等元命令可以正常工作。
支持的 PostgreSQL 特性 包括 SERIAL/自增、美元引用字符串、类型转换语法(如 '42'::int、NOW()::text)、JSON 操作符(在已实现范围内)、标准 PG 类型(INT、FLOAT8、TEXT、BOOLEAN、TIMESTAMP、JSON)以及 PostgreSQL 风格约束(PRIMARY KEY、NOT NULL、CHECK、DEFAULT)。
常见模式
- 每请求临时数据库(AI 智能体、沙箱):为每个会话创建独立的内存数据库,无需清理。
- 直接检查 SQLite 文件:用 sqlite3 CLI 查看表和 schema。
- 通过 pg 目录做 schema 内省:查询 pg_tables、information_schema.columns 等。
适用场景 适合需要嵌入式的 PostgreSQL 语法数据库、单文件或内存数据库、在 Node.js/浏览器中使用数据库能力的场景,以及希望用 psql 或 ORM 以 PostgreSQL 协议连接的测试与沙箱环境。
限制 pgmicro 是实验性项目,并非所有 PostgreSQL 功能都已被翻译。常见缺口包括:带复杂 PL/pgSQL 的存储过程、窗口函数、CTE(可能部分支持)、COPY 命令。线协议服务器只支持 PostgreSQL 线协议的子集,部分高级客户端功能(SSL、SCRAM 认证、扩展查询协议的边界情况)可能尚未实现,建议尽可能使用简单查询模式。故障排查方面:SERIAL 不自增时避免显式插入 NULL 到 id 列;psql 元命令无输出时确认表建在默认的 public schema;文件数据库不持久化时检查是否传了真实路径而非 :memory: 以及写权限;从源码构建报错时需要较新的稳定 Rust 工具链以及 libpg_query 本地依赖(C 编译器、cmake)。
资源 GitHub:glommer/pgmicro;上游引擎 Turso;libpg_query(PostgreSQL 解析器提取库);pg_query Rust crate;npm:pg-micro。