十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

PostgREST 部署指南:3 步把 Postgres 数据库变成 REST API

PostgREST 部署指南:3 步把 Postgres 数据库变成 REST API PostgREST 部署指南3 步把 Postgres 数据库变成 REST API【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrestPostgREST 部署其实就 3 步装好它连上你的 Postgres 数据库它就把数据库里每张表、每个视图直接变成 REST API 端点——你一行 CRUD 代码都不用写。接下来几分钟内完成 PostgREST 快速上手跑出一个能查、能改的 todos API并搞清楚它的权限到底由谁管。一条命令跑起来最短的 PostgREST 部署路径先说结论推荐用 Docker 跑 PostgREST 一个 Docker 版 Postgres全程不需要在宿主机装任何数据库组件。下面按顺序执行。先起一个 Postgres 容器docker run -d --name pg -p 5432:5432 -e POSTGRES_PASSWORDnotused postgres它会在 5432 端口起一个普通的 PostgreSQL 服务后面的配置都指向它。进入容器建表、造两个角色。整段贴进 psql 即可docker exec -it pg psql -U postgrescreate 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 (finish tutorial), (pat self on back); create role web_anon nologin; grant usage on schema api to web_anon; grant select on api.todos to web_anon; create role authenticator noinherit login password mysecretpassword; grant web_anon to authenticator;这里只做了两件事建api.todos表以及造两个角色——web_anon是匿名请求用的只读身份authenticator是 PostgREST 连库用的登录账号它自己没有任何表权限只被允许切换到web_anon。然后启动 PostgRESTdocker run --rm --networkhost \ -e PGRST_DB_URIpostgres://authenticator:mysecretpassword127.0.0.1:5432/postgres \ -e PGRST_DB_SCHEMASapi \ -e PGRST_DB_ANON_ROLEweb_anon \ postgrest/postgrest三个环境变量分别告诉它用哪个账号连库、把哪个 schema 暴露成 API、匿名请求落到哪个角色。看到API server listening on port 3000就是起来了。另开一个终端验证curl http://localhost:3000/todos返回一个包含两条 todo 的 JSON 数组你的第一个 PostgREST REST API 就跑通了。其他安装方式各一句话带过macOS 用brew install postgrestArch Linux 用pacman -S postgrestWindows 用choco install postgrest或者从 release 页下预编译二进制注意二进制依赖 libpq 这个 PostgreSQL C 库缺了会报libpq.so.5错误。它到底是怎么工作的PostgREST 把 URL 翻译成 SQL一句话概括PostgREST 不做业务逻辑它是URL 到 SQL 的翻译器——表名变资源路径查询参数变 WHERE/ORDER BY/LIMIT响应 JSON 直接由数据库序列化。先看结论再补细节表、视图 → 数据端点/todos数据库函数 → RPC 端点/rpc/函数名?ideq.1变成WHERE id 1?ordercreated_at.desc变成ORDER BY?limit10offset20变成分页外键关联可以直接写在select里做资源嵌入数据库一次查询就把关联数据带出来。下面这个影片库 schema 就是典型的例子Films表会生成/films端点Roles这类多对多关联表决定了你能用嵌入查询一次拿到某部片的全体演员为什么它快服务器用 Haskell 编写、基于 Warp HTTP 框架编译型语言 轻量线程通过连接池和预编译语句跟 Postgres 通信本身无状态——同一份进程可以在负载均衡后面随便加副本。官方数据是在 Heroku 免费层级上跑到 2000 请求/秒且响应亚秒级。三层安全防线连接层、数据层、请求层怎么分权限一句话概括PostgREST 自己不存任何谁能看什么的表授权逻辑全部下沉到 Postgres 的角色和策略里分三层各管一段。连接层authenticatordb-uri里的账号必须能登录但只保留可切换身份的能力不给它任何表权限。为什么需要它万一连接串泄露攻击者能做的最坏事情也就是 authenticator 本来能切换到的那几个角色能做的事而不是数据库管理员能做的事。数据层GRANT RLS表级权限决定能读还是能写行级安全策略RLSPostgres 按行过滤数据的机制决定能看到哪些行。为什么需要它数据库是权限的唯一事实来源——你绕开 API 直接连库和走 API 看到的是同一套规则不存在API 一套规则、库里另一套的缝隙。RLS 用法就两行alter table api.todos enable row level security; create policy todos_own on api.todos for all using (owner current_user);第一行打开按行过滤第二行声明每个人只能碰 owner 是自己的行SQL 里写current_user即可。请求层JWT不带 token 的请求落到web_anon带 token 的请求PostgREST 用jwt-secret验签再读 token 里的role声明把数据库会话SET ROLE成对应角色。为什么需要它服务端不用维护任何会话状态你是谁由 token 签名保证。图里是生成一个role: todo_user令牌的完整过程填 JSON、用共享密钥签名、把结果放进Authorization: Bearer头。之后curl -H Authorization: Bearer token ...发起的请求就会以todo_user身份执行——前提是你已把该角色 GRANT 给 authenticator 并授予对应表权限。生产级配置清单按场景给结论一句话概括不用背参数记住四类场景各自的结论再对照 docs/references/configuration.rst 查细节。场景结论关键设置高并发别把连接池开大用多副本横向扩实例数 × db-pool不要超过 Postgres 的max_connectionsdb-pool 20前面挂负载均衡多版本 API用 schema 做版本v1、v2各一套旧版本指向视图底层表随便换db-schemas v1,v2多环境配置写文件差异用PGRST_前缀的环境变量覆盖改完热重载不停机PGRST_DB_URIkillall -SIGUSR2 postgrest或库内notify pgrst;安全收紧关掉查询计划回显限死跨域来源匿名角色只留 SELECTdb-plan-enabled false、server-cors-allowed-origins https://yourapp.com补充两条连接池参数db-pool-acquisition-timeout等只在偶尔 503、提示获取连接超时时才需要调OpenAPI 生成模式默认跟随当前角色权限多租户下不需要额外动作。验证与排错工具箱常见报错速查 ✅先给两个日常验证手段curl -s http://localhost:3000/ | head # 返回 OpenAPI 文档列出当前角色可见的全部端点 curl -sI http://localhost:3000/todos | grep -i content-range # 看分页头前者相当于权限自检你的角色看不到什么这里就列不出什么后者确认分页头正常。⚠️ 排错表现象 → 原因 → 修复现象原因修复二进制模式报error while loading shared libraries: libpq.so.5缺 libpq 库Ubuntu/Debian 装libpq-devFedora/CentOS 装postgresql-libsmacOSbrew install postgresqlPOST /todos返回 401permission denied for table todos匿名角色只有 SELECT没给写权限grant insert, update, delete on api.todos to web_anon;后发 SIGUSR2 热重载启动即503或连接被拒db-uri端口/密码不对或 Postgres 的 pg_hba 拒绝该来源核对 URI 端口Docker 里确认 5432 已发布密码与create role时一致带 token 请求报invalid or expired tokenPGRST_JWT_SECRET与签发方密钥不一致或 token 过期两边密钥改成同一个字符串检查 token 的exp声明新建了表API 却仍是 404schema 缓存未刷新killall -SIGUSR2 postgrest或在数据库里执行notify pgrst;它适合什么不适合什么PostgREST 适合主体是对 Postgres 表做增删改查的应用后台管理、BFF 层、Supabase 这类产品的底层就是它、需要按角色精细控制数据可见性的多用户系统、以及希望 API 版本随 schema 演进而不用改服务端代码的场景。它不适合核心逻辑是复杂跨服务编排而非数据库查询的系统它没有工作流引擎函数端点只能补偿一部分、以及主库不是 PostgreSQL 的项目——整个架构的授权模型建立在 Postgres 角色之上换库等于换项目。【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表