PostgreSQL 数据库
CloudBase 提供了 PostgreSQL 数据库 服务,基于开源 PostgREST 构建,支持完整的 SQL 功能,并通过 表级 GRANT + 行级 RLS Policy 的双层权限模型,实现客户端可直连数据库的安全访问能力。
阅读前建议先了解 PG 模式概述,明确 PostgreSQL 在云开发环境中的整体定位。
先完成 MCP 连接,再选择一个提示词开始你的 AI 原生开发之旅
PG 模式:以 PostgreSQL 为中心
CloudBase PostgreSQL 数据库不只是"多了一个数据库选项",它代表了一种以 PostgreSQL 为中心的环境形态——PG 模式。在这种形态下,PostgreSQL 不仅承担业务数据存储,还作为统一基础设施,让账号、权限、云存储元数据都落到同一个数据库内:
- 业务数据:直接存进 PostgreSQL 表,客户端通过 PostgREST 自动暴露的 RESTful API 直连读写
- 权限模型:以 SQL 表达——表级
GRANT+ 行级RLS Policy双层校验,请求自带 JWT 由数据库判定权限 - 账号系统:用户数据存储在
authschema,可以直接用 SQL 查询、关联到业务表 - 云存储:文件元数据存储在
storageschema,权限同样用 RLS 表达,与业务数据共享一套权限语言
这意味着开发者 只需掌握 SQL 一套表达方式,就能完成数据建模、权限设计、跨域协作。本章后续文档(快速上手、权限管理、RPC 等)默认就在这个上下文中讨论,不再重复 "PG 模式" 这一前缀。
能力速览
| 能力 | 说明 |
|---|---|
| 完整 SQL | 表、视图、外键、索引、事务、触发器、存储过程、CTE、窗口函数、分区等 |
| PostgREST RESTful API | 表 / 视图 / RPC 自动暴露为 REST 接口,支持筛选、排序、分页、关联查询、嵌套写入 |
| 双层权限 | GRANT(表级) + RLS Policy(行级),双重锁定 |
| 三种访问角色 | anon / authenticated / service_role |
| 扩展生态 | pgvector + vectorscale、tencentdb_ai、zhparser / pg_jieba(中文分词)、TimescaleDB、Apache AGE、PL/V8 等 |
| 身份认证联动 | auth schema + JWT claims 可直接在 SQL 中读取用户身份 |
| 云存储联动 | storage schema 存储对象元数据,可与业务表 JOIN |
如何启用
当您创建 CloudBase PostgreSQL 版本环境时,PostgreSQL 数据库会自动启用,无需手动创建或初始化数据库实例。
访问数据库的三种 方式
1. 客户端 SDK(直连 + RLS)
最常用的方式。前端通过云开发 SDK 直接读写数据库,由 RLS 完成鉴权:
import cloudbase from '@cloudbase/js-sdk';
// 选择一种鉴权方式:
// (1) 使用 Publishable Key(前端可见):accessKey 传入即可,所有未显式登录的请求都以 anon 身份访 问
const app = cloudbase.init({ env: '<env-id>', accessKey: '<Publishable Key>' });
// (2) 或不传 accessKey,前端调用 auth.signInAnonymously() / signInWithPassword() 等显式登录
// const app = cloudbase.init({ env: '<env-id>' });
// await app.auth.signInAnonymously();
const db = app.rdb();
// 查询(RLS 自动按登录用户过滤)
const { data } = await db
.from('todos')
.select('id, title, is_completed')
.eq('is_completed', false);
// 新增(owner_id 由数据库默认值自动填充为 JWT 的 sub)
await db.from('todos').insert({ title: '写一篇文档' });
⚠️ SDK 请求必须携带 JWT(Publishable Key、access_token 或 API Key 三选一)。未提供时网关会拒绝请求。
云开发提供了多种 SDK 供开发者操作 PostgreSQL 数据库:
| SDK 类型 | 适用平台 |
|---|---|
| 小程序 ClientSDK | 小程序 |
| JS SDK | Web 浏览器 |
| Node SDK | Node.js 环境 |
| HTTP API | 通用 |
小程序 ClientSDK 获取 db 实例后,操作 PostgreSQL 数据库语法与 Web JS SDK 一致,具体语法请参考 JS SDK。
2. REST API(PostgREST 规范)
适用于无 SDK 场景(其他后端、低代码平台、第三方系统)。
基础端点:
REST: https://<envId>.api.tcloudbasegateway.com/v1/rdb/rest/<table>
Auth: https://<envId>.api.tcloudbasegateway.com/auth/v1
认证头: Authorization: Bearer <Publishable Key | access_token | API Key>
调用示例:
# 列出商品(匿名,使用 Publishable Key)
curl "https://<envId>.api.tcloudbasegateway.com/v1/rdb/rest/products?select=id,name,price&order=price.desc" \
-H "Authorization: Bearer <Publishable Key>"
# 登录后下单(使用 access_token)
curl -X POST "https://<envId>.api.tcloudbasegateway.com/v1/rdb/rest/orders" \
-H "Authorization: Bearer <access_token>" \
-H "Prefer: return=representation" \
-H "Content-Type: application/json" \
-d '{"product_id":1,"quantity":2,"total_price":199.00}'
详见 HTTP API - PostgREST RESTful API。
3. 云 API ExecutePGSql(管控面)
云 API ExecutePGSql 是管理员执行任意 SQL 的能力,常用于 CI/CD 自动化部署、数据库 schema 迁移、自动化建表等场景。
基本信息:
| 字段 | 值 |
|---|---|
| 接口名称 | ExecutePGSql |
| 端点 | tcb.tencentcloudapi.com |
| Version | 2018-06-08 |
| Region | 必填,与环境所在地域一致(如 ap-shanghai) |
| 签名方式 | TC3-HMAC-SHA256 |
请求体:
{
"EnvId": "<envId>",
"Sql": "<要执行的 SQL>",
"Role": "<可选,以指定的数据库角色执行;常用值:anon / authenticated / service_role>"
}
Role参数可省略:
- 省略时:以系统超级管理员角色
cloudbase_admin执行,具备SUPERUSER+BYPASSRLS权限,可执行任意 DDL(包括CREATE TABLE等结构变更)和绕过所有 RLS 策略- 指定
Role后(常用值:anon/authenticated/service_role):以指定角色执行 SQL,便于在管控面模拟特定角色调试 RLS 策略,验证策略是否符合预期。注意此时受 GRANT + RLS 约束
关于 DDL 语句:部分 DDL(CREATE / ALTER / DROP / GRANT / REVOKE / TRUNCATE / COMMENT 等)在通过 ExecutePGSql 直接执行时可能返回 InternalError。遇到失败时,可将该 DDL 包装为匿名代码块重试。匿名代码块需要 BEGIN ... END 与动态 EXECUTE,因此这里显式使用 LANGUAGE plpgsql;普通函数示例仍默认使用 LANGUAGE SQL:
-- 直接执行可能报错的 DDL
CREATE TABLE public.products (id serial PRIMARY KEY, name text);
-- 失败时包装为 DO $$ 代码块重试
DO LANGUAGE plpgsql $$
BEGIN
EXECUTE 'CREATE TABLE public.products (id serial PRIMARY KEY, name text)';
END
$$;
SQL 中的单引号
'在EXECUTE '...'内需转义为''。
Python 示例(使用腾讯云 SDK):
pip install tencentcloud-sdk-python
import json, re
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.tcb.v20180608 import tcb_client, models
SECRET_ID = "<your SecretId>"
SECRET_KEY = "<your SecretKey>"
ENV_ID = "<your envId>"
REGION = "ap-shanghai"
_DDL_KEYWORDS = re.compile(
r"^\s*(CREATE|DROP|ALTER|GRANT|REVOKE|TRUNCATE|COMMENT|"
r"SET|RESET|LOCK|REINDEX|CLUSTER|VACUUM|ANALYZE)\b",
re.IGNORECASE,
)
def _wrap_ddl(sql: str) -> str:
return f"DO LANGUAGE plpgsql $$ BEGIN EXECUTE '{sql.replace(chr(39), chr(39)*2)}'; END $$"
def execute_sql(sql: str, role: str = None, retry_with_wrap: bool = True) -> dict:
cred = credential.Credential(SECRET_ID, SECRET_KEY)
http_profile = HttpProfile()
http_profile.endpoint = "tcb.tencentcloudapi.com"
client_profile = ClientProfile()
client_profile.httpProfile = http_profile
client = tcb_client.TcbClient(cred, REGION, client_profile)
body = {"EnvId": ENV_ID, "Sql": sql}
if role:
body["Role"] = role
try:
req = models.ExecutePGSqlRequest()
req.from_json_string(json.dumps(body))
return json.loads(client.ExecutePGSql(req).to_json_string())
except Exception as e:
# 部分 DDL 直接执行会失败,自动用 DO $$ 包装重试
if retry_with_wrap and _DDL_KEYWORDS.match(sql.strip()):
return execute_sql(_wrap_ddl(sql), role=role, retry_with_wrap=False)
raise
# DML 直接执行
print(execute_sql("SELECT 1"))
# DDL 自动重试(失败时用 DO $$ 包装)
execute_sql("""
CREATE TABLE public.products (
id serial PRIMARY KEY,
name text NOT NULL,
price numeric(10,2) NOT NULL
)
""")
execute_sql("ALTER TABLE public.products ENABLE ROW LEVEL SECURITY")
execute_sql("GRANT SELECT ON public.products TO anon")
- 每次 API 调用只能执行一条 SQL,不能用分号拼接多条;批量执行请按行/分号拆分后逐条调用
- DDL 失败时使用
DO LANGUAGE plpgsql $$ BEGIN EXECUTE '...'; END $$包装;注意单引号转义。该匿名代码块依赖BEGIN和动态EXECUTE,因此需要LANGUAGE plpgsql - API 偶尔可能因后端短暂故障返回
InternalError,建议加入指数退避重试 - 本接口属于管理员操作,权限高,仅在后端使用,不要暴露 SecretKey
双层权限模型
数据库权限由两层组成,请求两层都通过才会成功:
请求 → JWT 解析 → 第一层:表级 GRANT(能执行哪些操作)
→ 第二层:RLS Policy(能访问哪些行)→ 返回结果