news 2026/9/4 11:17:49

5 分钟跑通 PostgREST:从一张表到第一个 PostgreSQL REST API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5 分钟跑通 PostgREST:从一张表到第一个 PostgreSQL REST API

5 分钟跑通 PostgREST:从一张表到第一个 PostgreSQL REST API

【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrest

你手边已经有一个 PostgreSQL 库,想立刻把它变成对外暴露的 REST API?PostgREST 就是干这个的:把表直接映射成端点,权限交给数据库角色,过滤写在 URL 查询参数里,一行后端代码都不用写。

选对姿势装 PostgREST,十分钟都不用

先说结论:装 PostgREST 这件事本身没有门槛,三种姿势按场景选就行。

macOS 上brew install postgrest,一行搞定,适合本地开发;Linux 上pacman -S postgrestapt install postgrest,适合你不想碰容器、直接跑在机器上的场景;想要环境完全一致,就一行命令拉起 PostgREST 容器:

docker run --rm --net=host -p 3000:3000 \ -e PGRST_DB_URI="postgres://app_user:password@localhost/postgres" \ postgrest/postgrest
姿势一条命令适合谁
包管理器brew install postgrest本地开发,省心
官方二进制解压 release 包里的postgrest单文件要锁定具体版本
Dockerdocker run -e PGRST_DB_URI=... postgrest/postgrest生产、CI

⚠️ 生产环境建议 Docker:镜像极小,环境一致,坏了一眼就能看出来。

最小可运行配置:只写四个参数

装好之后,先别急着看全部配置项。让 PostgREST 活过来,只需要四个参数:

# postgrest.conf db-uri = "postgres://authenticator:mysecret@localhost:5432/postgres" db-schemas = "api" db-anon-role = "web_anon" server-port = 3000

db-uri是连接串,里面这个角色必须是后面会讲的认证器;db-schemas告诉 PostgREST 暴露哪个 schema;db-anon-role是匿名请求用的角色。端口不写默认就是 3000,连接池默认 10,够起步用了。

postgrest postgrest.conf

看到API server listening on port 3000就说明它活了。另开一个终端验证:

curl http://localhost:3000/

返回一个空的 JSON 对象{},没报 500,链路就通了。

三个角色看懂 PostgREST 安全模型

理解 PostgREST 的权限,记住一条链路就够了:

打个比方:authenticator 就像前台,每个进来的请求先由它接电话;带着 JWT 的,它转给令牌里声明的那个人;没带令牌的,一律转给接待处 web_anon。至于对方能碰哪些表,全看数据库里怎么授权,跟 PostgREST 本身无关。这就是"安全交给数据库"的含义。

三个角色建起来其实就五行:

create role authenticator login noinherit password 'mysecret'; create role web_anon nologin; create role web_user nologin; grant web_anon, web_user to authenticator;

端到端实战:建张 todos 表,curl 把它摸一遍

下面是一个完整的故事线:建表、授权、起服务,然后对/todos做一轮增删改查。

先建表,这是 API 的第一个端点:

create schema api; create table api.todos ( id int generated by default as identity primary key, task text not null, done boolean not null default false, due timestamptz ); insert into api.todos (task) values ('跑通 PostgREST');

再给匿名角色开权限:

grant usage on schema api to web_anon; grant select on api.todos to web_anon;

配置文件换成上面那四个参数,db-schemasapi。启动后,开测:

curl "http://localhost:3000/todos"

你应看到:一行 JSON 数组,跑通 PostgREST那条就在里面,响应头里还有Content-Range

curl -X POST http://localhost:3000/todos \ -H "Content-Type: application/json" \ -d '{"task":"再写条"}'

你应看到:201 加上新记录,id 是数据库自动生成的。

curl -X PATCH "http://localhost:3000/todos?done=is.false" \ -d '{"done":true}'

你应看到:204 无内容,之前那条被标记完成了。

curl -X DELETE "http://localhost:3000/todos?done=is.false"

你应看到:204,记录没了。

顺手测一下过滤和排序,这是 PostgREST 日常最好用的部分:

curl "http://localhost:3000/todos?done=is.true&select=task,due&order=due.asc"

只回传你select里的列,按due升序。要是忘了建表就请求/todos,会得到 404;拿只读角色去 POST,会得到 401 加一句permission denied——这两条报错,是这套权限模型在正常工作的证明。

上生产前:六项加固清单

  1. 给需要按用户隔离的表启用行级安全:alter table api.todos enable row level security;然后写策略。
  2. 连接池按并发调:db-pool = 20,默认 10,不够就加,别盲目拉满。
  3. JWT 密钥定期换;容器里用jwt-secret-is-base64 = true喂 base64 密钥,比裸字符串好管理。
  4. 跨域来源收紧:server-cors-allowed-origins = "https://your-frontend.example",别用默认的全放行。
  5. 日志降档:本地log-level = "debug",生产error,别把 debug 留在生产。
  6. 兜底行数限制:db-max-rows = 1000max-affected,防手滑触发万行级的大查询。

完整参数在 docs/references/configuration.rst 里,按需查就行,不用背。

避坑速查:现象 → 原因 → 解法

现象原因解法
Address already in use3000 端口被占配置里换server-port = 3001
failed to connect连接串或pg_hba.conf不匹配核对db-uri,检查 PG 认证方式
401permission denied角色没被授予对应表权限给 anon 角色补grant,重启服务
JWT 被拒jwt-secret不一致前后端用同一把密钥,核对 base64 标记
404db-schemas不含目标 schema修正db-schemas,给角色 grant usage
200 但空数组anon 角色缺 select补权限;注意 schema 变更后要等缓存重载

两个提醒:改完数据库里的权限和结构,PostgREST 要重载才生效;Docker 部署时优先用PGRST_前缀的环境变量,比如PGRST_DB_URI,不用挂载配置文件。

下一步往哪走

跑通之后,自然的下一步是看/路径返回的 OpenAPI 文档——你的 API 长什么样,它自己会说;再往后是多 schema 隔离和 RLS 的多租户进阶。完整配置参考见 docs/references/configuration.rst,官方教程从 docs/tutorials/tut0.rst 开始。

【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrest

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 11:17:36

工业自动化信号全解析:从DI/DO/AI/AO到干扰防护

信号,这大概是所有刚跨进工业自动化门槛的人最先撞上的概念,也是干了十年八年的人回头看仍然觉得最值得琢磨的东西。我面试电气工程师或者PLC调试岗的时候,很少直接问“你会不会写梯形图”,更多时候会拿一张IO点表扔过去&#xff…

作者头像 李华
网站建设 2026/9/4 11:16:50

AFE芯片深度解析:BMS电池管理系统的模拟前端核心

AFE芯片这几年在新能源圈子里热度高得离谱。我做锂电BMS相关项目也有些年头了,身边时不时就有朋友拿着某款车规级AFE的数据手册来问:这东西凭什么这么贵?国产的到底能不能用?每次我都要从头解释一遍,讲得口干舌燥。后来…

作者头像 李华
网站建设 2026/9/4 11:16:50

如何快速搞定 macOS 菜单栏:Ice 菜单栏管理完整指南

如何快速搞定 macOS 菜单栏:Ice 菜单栏管理完整指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 你的 macOS 菜单栏是不是已经挤成一锅粥?Wi-Fi、电池、时间旁边还插着七八…

作者头像 李华
网站建设 2026/9/4 11:16:15

游戏逆向实战:“全都要”思路下的动静态结合与工具链协同分析

游戏逆向这个领域,我一直觉得特别有意思。它像一局围棋,光会一种套路赢不了高手,你得了解布局、定式、中盘、收官,有时候还得会点“吃大龙”的手段。“游戏逆向实战:我全都要”这个标题,其实说的就是这种心态——不是找…

作者头像 李华
网站建设 2026/9/4 11:15:51

边缘AI控制器Edgi-X深度拆解:芯片+RT-Thread+行业方案的落地之道

说实话,这几天我朋友圈里做嵌入式、做机器人的朋友几乎都在转发同一条消息——英飞凌联合RT-Thread、释云科技,正式发布了面向全域无人载具的AI控制器Edgi-X。做无人机的、做无人车的、做水面无人艇的,转发热情都很高。这在往年并不多见&…

作者头像 李华
网站建设 2026/9/4 11:14:07

数字员工在业务转型中引领潮流,深度分析语音智能体的核心应用与优势

数字员工凭借其先进的技术,正在为企业优化业务流程、降低成本和提升效率带来重要价值。在现代商业环境中,语音智能体以其高效的自动化外呼能力,能够减少对人工座席的依赖。通过自动化处理大量的客户呼叫,企业能够节省人力资源开支…

作者头像 李华