从 Supabase Storage 迁移
PG 模式云存储与 Supabase Storage 在 storage schema、Bucket / Object 元数据模型和 RLS 思路上高度相似。如果你的应用主要使用 Supabase 的 File Buckets,可以按本文迁移到 CloudBase。
迁移前确认
迁移前请先确认现有 Supabase Storage 的使用范围:
| 检查项 | 说明 |
|---|---|
| Bucket 类型 | 迁移对象应是通用文件 Bucket,例如图片、视频、文档、压缩包 |
| 访问模型 | Public / Private Bucket、Signed URL、Authenticated download |
| RLS Policy | storage.objects 上的 SELECT / INSERT / UPDATE / DELETE 策略 |
| 路径规则 | 是否使用 <uid>/<filename>、<team_id>/<filename> 等路径约定 |
| 上传限制 | 文件大小限制、MIME 类型限制 |
| SDK API | 是否使用 upload、download、list、remove、createSignedUrl 等能力 |
建议先选一个低风险 Bucket 做试迁移,例如 avatars 或测试附件 Bucket。
可复用的内容
以下内容通常可以复用或少量调整后复用:
| Supabase Storage 内容 | CloudBase 对应内容 |
|---|---|
storage.buckets | storage.buckets |
storage.objects | storage.objects |
bucket_id | bucket_id |
name 对象路径 | name 对象路径 |
owner_id | owner_id |
metadata / user_metadata | metadata / user_metadata |
storage.foldername(name) | storage.foldername(name) |
storage.filename(name) | storage.filename(name) |
| 大部分 RLS Policy 思路 | 可迁移为 CloudBase RLS Policy |
例如,按用户目录隔离的策略通常只需确认 auth.uid()、角色名和 Bucket ID 是否一致。
CREATE POLICY user_files_select ON storage.objects
FOR SELECT TO authenticated
USING (
bucket_id = 'user-files'
AND (storage.foldername(name))[1] = auth.uid()
);
需要调整的内容
public 语义需要复核
在 CloudBase PG 模式中,storage.buckets.public 是元数据标记,不会自动绕过 RLS。是否公开可读,仍由 storage.objects 上的 SELECT Policy 决定。
如果 Supabase 中某个 Public Bucket 依赖「知道 URL 即可访问」的语义,迁移后需要显式补充公开读策略:
CREATE POLICY objects_public_read ON storage.objects
FOR SELECT TO anon, authenticated
USING (
EXISTS (
SELECT 1 FROM storage.buckets b
WHERE b.id = storage.objects.bucket_id
AND b.public
)
);
SDK 初始化和项目配置不同
Supabase:
import { createClient } from '@supabase/supabase-js';
const supabase = createClient('<project-url>', '<anon-key>');
const bucket = supabase.storage.from('avatars');
CloudBase:
import cloudbase from '@cloudbase/js-sdk';
const app = cloudbase.init({ env: '<env-id>' });
const bucket = app.storage.from('avatars');