宿æç¨ï¼çµåå°ç¨åº
é 读å建议å äºè§£ PG æ¨¡å¼æ¦è¿°ï¼æç¡® PostgreSQLã身份认è¯ãäºåå¨åæé模åçå ³ç³»ã
æ¬æä»¥ä¸ä¸ªçµåå°ç¨åºä¸ºå®æ´å®æåºæ¯ï¼å¸¦ä½ 端å°ç«¯å®æ CloudBase PostgreSQL æ°æ®åºä¸çæ°æ®å»ºæ¨¡ãæé设计ãREST API è°ç¨ç宿´é¾è·¯ãè¦ççè½åï¼
- å¤è¡¨å»ºæ¨¡ä¸å¤é®çº¦æ
- å屿éï¼GRANT + RLSï¼ç综åè¿ç¨
- ä¸åè§è²ï¼
anon/authenticated/service_roleï¼çå·®å¼åè®¿é® - PostgREST REST API ç宿´ä½¿ç¨ï¼çéãæåºãå页ãPreferï¼
- åºäº
is_activeçè½¯ä¸æ¶ãåºäº JWT çä¸å身份ç»å®ã"订åä¸å¯æ¹"çå ¸åä¸å¡è§å
ð¡ è¯»å®æ¬æåï¼ä½ å°±å¯ä»¥æåæ ·çæè·¯å¥ç¨å°å客ãç§äººç¬è®°ãSaaSã社交çåç§åºç¨ä¸ã
åºæ¯æ¦è¿°â
æå»ºä¸ä¸ªç±»ä¼¼ Shopify / æèµ / å°ç¨åºåå ççµååºç¨ï¼éè¦ï¼
| åè½ | 说æ |
|---|---|
| ðª ååæµè§ | ææäººï¼å æ¬æªç»å½ç¨æ·ï¼å¯æµè§ä¸æ¶åå |
| ð 䏿¶ååéè | is_active=false çåå对æ®éç¨æ·ä¸å¯è§ |
| ð ä¹°å®¶ä¸å | ç»å½ç¨æ·å¯å建订åï¼ä¹°å®¶èº«ä»½èªå¨ç»å® |
| ðï¸ è®¢åç§æ | æ¯ä¸ªä¹°å®¶åªè½çå°èªå·±ç订å |
| ð« 订åä¸å¯æ¹ | ä¹°å®¶ä¸ååä¸è½ä¿®æ¹æåæ¶ï¼åªæç®¡çåå¯åæ´ç¶æ |
| ð¨âð¼ 管çåå ¨æ | 管çåå¯ç®¡çååãå¤çææè®¢åç¶ææµè½¬ |
æ°æ®æ¨¡åâ
ââââââââââââââââââââââââââ âââââââââââââââââââââââââââ
â products â â orders â
âââââââââââââââââââââââââ⤠âââââââââââââââââââââââââââ¤
â id (serial PK) âââââ â id (serial PK) â
â name (text) â â â product_id (int FK) âââââ
â description (text) â â â buyer_id (text, JWT) â
â price (numeric) â âââ⤠quantity (int) â
â stock (int) â â total_price (numeric) â
â category (text) â â status (text) â
â is_active (bool) â â address (jsonb) â
â created_at (timestamptz)â â created_at (timestamptz)â
ââââââââââââââââââââââââââ âââââââââââââââââââââââââââ
åç½®åå¤â
- å·² å建 PG 模å¼çäºå¼åç¯å¢
- å·²æ¿å° Publishable Key å API Keyï¼è¯¦è§ PGï¼èº«ä»½è®¤è¯ - åè¯ä¸ JWTï¼
- ç¯å¢ ID 记为
<envId>ï¼ä¾å¦pg-test-3gxmdbdb580ecfd1 - API 端ç¹ï¼
- RESTï¼
https://<envId>.api.tcloudbasegateway.com/v1/rdb/rest/v1 - Authï¼
https://<envId>.api.tcloudbasegateway.com/auth/v1
- RESTï¼
SQL æ§è¡é¡ºåºâ
ä»¥ä¸ SQL ä¸¥æ ¼æä»¥ä¸é¡ºåºæ§è¡ï¼å¦åä¼å ä¾èµå ³ç³»æ¥éï¼
建表 (CREATE TABLE)
â å¯ç¨ RLS (ALTER TABLE ... ENABLE ROW LEVEL SECURITY)
â ææ (GRANT)
â å建çç¥ (CREATE POLICY)
æ¸
çæ¶éååºï¼å
å Policy â åè§£é¤ RLS â æåå 表ï¼DROP TABLE ... CASCADE å¯èªå¨æ¸
ç Policyï¼ã
ð§ SQL å¯éè¿æ§å¶å°ç SQL ç¼è¾å¨ ç´æ¥éæ¡æ§è¡ï¼ä¹å¯éè¿äº API
ExecutePGSqlèªå¨åé¨ç½²ï¼é¨å DDL å¨ API è·¯å¾ä¸éç¨DO LANGUAGE plpgsql $$ BEGIN EXECUTE '...'; END $$å è£ éè¯ï¼è¿æ¯å¿åè¿ç¨ä»£ç åï¼è¯¦è§ æ¶æä¸æéæ¨¡å - ExecutePGSqlï¼ã
ç¬¬ä¸æ¥ï¼å»ºè¡¨â
-- âââââââââââââââââââââââââââââââââââââââââââââââââââ
-- åå表
-- âââââââââââââââââââââââââââââââââââââââââââââââââââ
CREATE TABLE public.products (
id serial PRIMARY KEY,
name text NOT NULL,
description text,
price numeric(10,2) NOT NULL,
stock int DEFAULT 0,
category text,
is_active boolean DEFAULT true, -- true=䏿¶, false=䏿¶
created_at timestamptz DEFAULT now()
);
-- âââââââââââââââââââââââââââââââââââââââââââââââ ââââ
-- 订å表
-- âââââââââââââââââââââââââââââââââââââââââââââââââââ
CREATE TABLE public.orders (
id serial PRIMARY KEY,
product_id int NOT NULL REFERENCES public.products(id),
-- â buyer_id èªå¨ä» JWT ä¸è·åå½åç¨æ·ç subï¼auth.users.id ç±»å为 varchar(64)ï¼
buyer_id varchar(64) NOT NULL
DEFAULT (current_setting('request.jwt.claims', true)::json->>'sub'),
quantity int NOT NULL DEFAULT 1,
total_price numeric(10,2) NOT NULL,
status text NOT NULL DEFAULT 'pending', -- pending â paid â shipped â completed
address jsonb, -- æ¶è´§å°åï¼ç»æå JSONï¼
created_at timestamptz DEFAULT now(),
updated_at timestamptz DEFAULT now()
);
CREATE INDEX idx_orders_buyer_id ON public.orders(buyer_id);
å ³é®è®¾è®¡ï¼
buyer_id使ç¨DEFAULT (current_setting('request.jwt.claims', true)::json->>'sub')èªå¨ä» JWT ä¸è·åå½åç¨æ· IDï¼æ éåç«¯ä¼ å ¥ï¼æç»äºèº«ä»½ä¼ªé çå¯è½ã
ç¬¬äºæ¥ï¼å¯ç¨ RLSâ
ALTER TABLE public.products ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.orders ENABLE ROW LEVEL SECURITY;
å¯ç¨ RLS åï¼å¦ææ²¡æä»»ä½ Policyï¼ææé
service_roleç¨æ·é½æ æ³è®¿é®ä»»ä½æ°æ®ï¼é»è®¤æç»ï¼ãç»§ç»ä¸ä¸æ¥ã