prest/prest · 上手攻略
- 仓库:prest/prest
- 链接:https://github.com/prest/prest
- 分类:skill
- 作者:Tom
- 更新:2026-08-27
是什么
pREST(PostgreSQL REST,读作 "prest")是一个生产可用的后端工具,能在已有的或新建的 PostgreSQL 数据库上瞬间生成 RESTful API 和 MCP(Model Context Protocol)接口,无需手写后端代码。官方定位是"low-code simplify and accelerate development",核心功能包括:
- CRUD REST API:对任意表自动生成 GET/POST/PUT/DELETE 端点
- 自定义 SQL 路由:通过
_QUERIES脚本模板执行复杂查询 - 权限控制(ACL):基于 JWT 和表/列级别的访问控制
- MCP 接口:v2.1.0+ 支持 AI Agent 通过 MCP 协议读写数据库
- 多数据库路由:同一实例支持连接多个 PostgreSQL 数据库
最新版本为 v2.4.2(2026 年初),Go 语言编写,单二进制部署,文档详见 docs.prestd.com。
解决什么问题
传统开发中,为数据库提供 HTTP 接口需要:写 CRUD 代码 → 配置路由 → 写权限校验 → 部署服务。pREST 把这一链路压缩到配置 + 启动两步:
- 给现有 PostgreSQL 数据库(业务数据库或新库均可)立刻拥有 HTTP 接口
- AI Agent(Claude、Cursor 等)可以通过 MCP 协议直接查询数据库
- 快速搭建内部管理后台、数据看板后端,不需要单独写 API 服务
快速安装
方式一:Docker(推荐,最快)
docker run -d \
--name prestd \
-p 3000:3000 \
-e PREST_PG_URL=postgres://user:password@host:5432/mydb \
prest/prest:v2.4.2
访问 http://localhost:3000 即可。
方式二:Homebrew(macOS/Linux)
brew install prestd
# 或 MCP 专用适配器(stdio ↔ HTTP 桥接)
brew install prest/tap/prest-mcp
方式三:Go 直接安装
go install github.com/prest/prest/v2/cmd/prestd@v2.4.2
方式四:下载二进制
从 GitHub Releases 下载对应平台的压缩包,解压即用,无需 Go 环境。
环境变量配置
| 变量 | 说明 | 示例 |
|---|---|---|
PREST_PG_URL |
PostgreSQL 连接字符串 | postgres://user:pass@localhost:5432/mydb |
DATABASE_URL |
同上,兼容 Rails/其他框架格式 | 同上 |
PREST_JWT_KEY |
JWT 签名密钥(≥32 字节,v2.4.2 强制) | your-secret-key-min-32-bytes-here |
PREST_AUTH_ENABLED |
开启认证 | true |
核心用法
1. 自动 CRUD
连接数据库后,直接用 HTTP 访问任意表:
# 获取 users 表所有数据(公开模式需开启匿名访问)
curl http://localhost:3000/public/users
# 带过滤条件
curl "http://localhost:3000/public/users?age=gte:18&name=ilike:john%"
# 分页
curl "http://localhost:3000/public/users?_page=2&_page_size=20"
# 排序
curl "http://localhost:3000/public/users?_order=created_at:desc"
# 只取特定字段
curl "http://localhost:3000/public/users?_select=id,name,email"
2. 插入 / 更新 / 删除
# 插入
curl -X POST http://localhost:3000/public/articles \
-H "Content-Type: application/json" \
-d '{"title": "Hello World", "slug": "hello-world", "content": "..."}'
# 更新
curl -X PUT http://localhost:3000/public/articles \
-H "Content-Type: application/json" \
-d '{"title": "Updated Title"}' \
"?slug=eq:hello-world"
# 删除
curl -X DELETE "http://localhost:3000/public/articles?slug=eq:hello-world"
3. 自定义 SQL 查询(_QUERIES)
将 .sql 文件放入配置的 _QUERIES 目录后,可通过 REST 路径调用:
# queries/myquery.sql
# SELECT * FROM articles WHERE slug = {{.slug}}
curl "http://localhost:3000/_QUERIES/myquery?slug=hello-world"
⚠️ 安全注意:pREST 会对插值进行审查,拒绝包含引号、--、:: 等 SQL 关键字模式的自由文本。对于用户提供的搜索词,建议使用绑定变量而非插值:
-- ✅ 推荐:使用 {{sqlVal "key"}} 绑定参数
SELECT * FROM articles WHERE slug = {{sqlVal "slug"}}
-- ⚠️ 自由插值会被拒绝(slug 含空格/关键字时)
SELECT * FROM articles WHERE slug = '{{.slug}}'
4. MCP 接口(AI Agent 接入)
v2.1.0 起,在同一 prestd 进程提供 /_mcp 端点,AI 客户端(如 Claude Desktop、Cursor)可直接探索数据库 schema、读取表数据,无需单独配置 MCP 适配器。
对于需要 stdio 模式的 AI 客户端(如 Claude Code),使用 prest-mcp 适配器作为 HTTP ↔ stdio 桥接:
# 启动 MCP 适配器
prest-mcp --prest-url http://localhost:3000
AI 客户端配置示例(claude_desktop_config.json):
{
"mcpServers": {
"prestd": {
"command": "prest-mcp",
"args": ["--prest-url", "http://localhost:3000"]
}
}
}
5. JWT 认证
# 登录获取 token(需预先配置用户)
curl -X POST http://localhost:3000/_TOKEN \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "secret"}'
# 后续请求带上 token
curl http://localhost:3000/private/users \
-H "Authorization: Bearer <token>"
典型适用场景
| 场景 | 说明 |
|---|---|
| 内部工具快速后端 | 给 PostgreSQL 数据库瞬间加一层 HTTP 接口,省去独立 API 服务 |
| AI Agent 数据库查询 | Claude/Cursor 通过 MCP 协议直接读数据库,无需手写 SQL |
| SaaS 多租户数据路由 | 通过多数据库配置,隔离不同租户的数据 |
| 数据看板/报表后端 | 为 BI 工具提供统一 REST 接口 |
| 快速原型验证 | 前端先行,后端 API 用 pREST 生成,后期再替换为手写服务 |
坑与注意
⚠️ v2.4.2 JWT key 强制最低长度:HMAC JWT key 必须 ≥32 字节,不足时服务启动时 auth 自动禁用(而非报错),可能造成安全漏洞,务必确认 key 长度。
⚠️ MCP 接口为只读:v2.1.0 起 MCP 仅支持 schema 发现和 SELECT 操作,不支持 INSERT/UPDATE/DELETE;写操作仍通过 REST API。
⚠️ PostgreSQL only(当前):官方当前仅支持 PostgreSQL 及部分兼容引擎(见 roadmap)。MySQL、MongoDB 等暂不支持。
⚠️ SQL 插值安全需主动防御:pREST 的 _QUERIES 审查机制仅对插值做文本过滤,不等于参数化查询;使用 {{sqlVal}} 绑定变量是正确做法。
⚠️ 生产环境建议加 Nginx 反向代理:pREST 本身不提供速率限制,_QUERIES 脚本路径可能暴露业务逻辑,建议外层加 API Gateway 或 Nginx 限制并发。
⚠️ pgvector 支持:v2.4.0 起内置 pgvector 支持,但向量检索仍需手写 SQL 查询,pREST 不会自动生成向量搜索端点。
⚠️ JWT key 密钥管理:key 建议通过环境变量注入,不要明文写在配置文件里。
与同类对比
| 工具 | 类型 | 特点 | 适合谁 |
|---|---|---|---|
| pREST | 开源(Go) | REST + MCP 双接口、CRUD 即开即用 | 已有 PG 数据库的快速 API 化 |
| DreamFactory | 商业 SaaS | 多数据库、API 管理界面 | 企业级多数据源统一 API |
| PostgREST | 开源(Haskell) | 纯 REST,理念与 pREST 相近 | 追求极简、不需要 MCP 的场景 |
| Supabase | 商业 + 开源 | PG 之上的完整 BaaS,REST + Auth + Realtime | 需要完整后端能力的项目 |
| Hasura | 商业 + 开源 | GraphQL + REST,PG 支持强大 | 需要 GraphQL 接口的团队 |
| pgEdge MCP Server | 开源 | 独立 PG MCP Server | 需要标准 MCP 但不需要 REST 的场景 |
pREST 的差异化在于:REST + MCP 双协议共存、Go 二进制单文件部署极简、对已有 PG 数据库的零侵入接入。缺点是生态和周边工具不如 Supabase/Hasura 丰富。
一句话推荐结论
已有 PostgreSQL 数据库、想快速为它加上 HTTP 接口或让 AI Agent 直接查询时,pREST 是目前最轻量的选择——单二进制启动即用,v2.4.2 + MCP 支持让它同时覆盖人类开发者和 AI 代理两类消费者;需要多数据库、更强生态或商业支持则考虑 Supabase/Hasura。