ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

5分钟把 PostgreSQL 变成 REST API:PostgREST 新手上手指南

5分钟把 PostgreSQL 变成 REST API:PostgREST 新手上手指南 5分钟把 PostgreSQL 变成 REST APIPostgREST 新手上手指南【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrest先别急着看安装步骤直接看效果。假设你的 PostgreSQL 里有一张todos表对 PostgREST 发一个请求curl http://localhost:3000/todos几毫秒后返回[{id:1,task:写个查询,done:false}, {id:2,task:部署到服务器,done:true}]完事了。没有 controller没有 DTO没有任何一行接口代码——表就是接口。读完这篇文章你能自己用 Docker 跑起一套 PostgREST 服务给表配好最小权限并做出过滤、分页、关联查询。全程大概 10 分钟。PostgREST 是什么帮你省了什么一句话PostgREST 是一个独立的 Web 服务把任意 PostgreSQL 数据库暴露成 RESTful API。你平时手写接口层要干的活——路由、解析查询参数、拼 SQL、序列化成 JSON、处理分页头——它全包了而且性能很好。更关键的是谁能看、谁能改不由框架代码决定而由 PostgreSQL 的角色和权限决定。加一个端点 建一张表加一个权限策略 写一条 GRANT。Docker 最快启动路径推荐走 Docker官方镜像用 Nix 从scratch构建里面只有一个静态二进制整包约 14 MB没有 shell 和多余依赖攻击面小拉取也快。不想折腾 compose 的话也可以直接docker run -p 3000:3000 -e PGRST_DB_URIpostgres://authenticator:mysecretpassworddb:5432/postgres postgrest/postgrest完整一点的 docker-compose 写法数据库和应用一起起services: db: image: postgres environment: POSTGRES_PASSWORD: mysecretpassword ports: - 5432:5432 server: image: postgrest/postgrest environment: PGRST_DB_URI: postgres://authenticator:mysecretpassworddb:5432/postgres PGRST_DB_SCHEMAS: api PGRST_DB_ANON_ROLE: web_anon ports: - 3000:3000 depends_on: - dbdocker compose up -d之后访问http://localhost:3000能看到 PostgREST 的欢迎页说明服务已就绪。其他安装方式带过一句各平台基本都有包管理器渠道brew install postgrest、pacman -S postgrest等也可以从官方 release 下载静态二进制直接跑。注意二进制需要系统装有 libpqPostgreSQL 的 C 客户端库Docker 镜像则不需要操心这些。从零跑通第一个 PostgreSQL REST API建一张表先给 API 专用的表建一个独立的 schema相当于表所在的命名空间避免把内部表也暴露出去create schema api; create table api.todos ( id int primary key generated by default as identity, task text not null, done boolean not null default false ); insert into api.todos (task) values (买咖啡), (写周报);配最小权限只读表建好了谁有资格读给匿名访客单独开一个只读角色create role web_anon nologin; grant usage on schema api to web_anon; grant select on api.todos to web_anon;再建一个认证器角色它持有db-uri里的密码负责和数据库建立连接然后变身成别的角色去执行查询create role authenticator noinherit login password mysecretpassword; grant web_anon to authenticator;grant web_anon to authenticator是关键它允许连接切换成web_anon。少了这一句所有请求都会报权限错误。最小配置与启动建一个postgrest.conf跑通只需要三行db-uri postgres://authenticator:mysecretpasswordlocalhost:5432/postgres db-schemas api db-anon-role web_anondb-uriPostgREST 连数据库用的连接串认证器角色的密码在里面。db-schemas哪些 schema 里的表/视图会暴露成端点。db-anon-role没带 JWT 的请求以哪个角色执行。启动并验证postgrest postgrest.conf curl http://localhost:3000/todos看到刚才插入的两行数据恭喜你的表已经是个 API 了。顺手做个写操作试试curl -X POST http://localhost:3000/todos -H Content-Type: application/json -d {task:再写一个}会得到 401 和message: permission denied for table todos——这不是 bug是我们只授了 SELECT权限模型按预期生效。权限怎么控谁能看谁能改PostgREST 自己不管授权它只负责把请求翻译成数据库操作判断全交给 PostgreSQL 的角色系统。理解三个角色就够了认证器authenticator拿着db-uri密码建连接的角色本身不给任何表权限。匿名角色anon role没带令牌的请求走它一般只读甚至只读几张公开表。用户角色登录后对应多个角色各配各的权限。登录怎么关联请求头带一个 JWTPostgREST 用jwt-secret验签后读取载荷里的role声明把连接切换成同名数据库角色create role web_user nologin; grant select, insert, update on api.todos to web_user; grant web_user to authenticator;curl http://localhost:3000/todos -H Authorization: Bearer your-jwt于是权限变成匿名只能查带{role:web_user}令牌的请求可以增改没给 GRANT 的东西谁都动不了。加角色、改权限都是普通 SQL不用重启服务。查询参数速查PostgREST 的查询能力全在 URL 参数里不用写任何代码场景参数示例说明过滤/todos?doneis.false常用操作符eq.neq.gt.lt.like.in.(a,b,c)is.null组合逻辑/todos?or(done.is.true,task.like.%周报%)or里写多个条件排序/todos?ordercreated_at.desc多列用逗号分隔分页/todos?limit10offset10响应头自带Content-Range方便算总页数只取部分列/todos?selectid,task减少传输体积关联嵌入/films?selectid,title,actors(*)沿外键把关联表嵌进结果聚合/todos?selectcount或selectcount(...)统计关联嵌入是它最好用的功能之一只要表之间有外键select里用括号把子资源展开一次请求拿到树形结构上生产前配置与部署要点常用配置项就这些其余详见仓库里的 配置文档配置项说明db-uri/db-pool连接串与连接池大小默认 10db-anon-role匿名请求使用的角色db-schemas对外暴露的 schema 列表jwt-secret至少 32 字符对称签名密钥。配置 PostgREST 的 jwt-secret 时别图省事用短字符串server-portHTTP 端口默认 3000db-max-rows单次查询最大返回行数防止全表拖垮server-cors-allowed-origins前端跨域白名单两个实用机制环境变量覆盖任何配置项都可以用PGRST_前缀的环境变量覆盖比如PGRST_JWT_SECRET、PGRST_SERVER_PORT。K8s、Docker 场景下用环境变量比挂载配置文件干净得多。热重载修改配置后向进程发SIGUSR2即可重载不用重启断流。Docker 部署要点镜像无 shell排查问题别指望docker exec进去ls生产建议只映射 3000 端口、数据库不暴露公网把 PostgREST 放在反代Nginx 等后面处理 TLS。新手高频坑1. 报错libpq.so加载失败—— 你装的是裸二进制系统缺 PostgreSQL 客户端库。装上它即可Debian/Ubuntu 是libpq-dev或者干脆换 Docker 跑绕开这个问题。2. 启动就连不上数据库—— 三个方向密码对不对角色有没有LOGIN权限认证器必须能登录服务器pg_hba.conf是否放行了该来源和认证方式。Docker 里注意db-uri的主机名要写服务名而不是localhost。3. 请求返回 401/403permission denied—— 十有八九是 GRANT 没配齐。按顺序查角色授给了认证器吗schema 的USAGE授了吗表的读/写权限授给了执行角色吗4. 端口被占用—— 5432 被本机 PostgreSQL 占着时把 compose 里映射的第一个端口改掉如5433:5432记得同步改db-uriPostgREST 默认占 3000冲突就改server-port。下一步到这里你已经拥有一张表、一个只读 API、一套基于数据库角色的权限控制——而这一切的源代码就是 SQL。接下来推荐两条线想收紧到行级别学RLS行级安全让每个用户只看见自己的数据想要文档打开/openapi看看自动生成的 OpenAPI 规范。更深入的内容可以看仓库里的 官方教程。【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表