Skip to content

学习supabase

约 2101 字大约 7 分钟

2025-07-29

我们正在学习 Supabase,这是一个开源的 Firebase 替代方案,提供后端服务,包括数据库、身份验证、存储等。下面我将逐步介绍 Supabase 的核心概念和使用方法。

1. 什么是 Supabase?

Supabase 是一个开源的后端即服务(BaaS)平台,它构建在 PostgreSQL 数据库之上,并提供实时功能、身份验证、存储、边缘函数等。Supabase 的目标是提供一个与 Firebase 类似但基于开源技术的解决方案。

2. 核心组件

  • PostgreSQL 数据库:Supabase 使用 PostgreSQL 作为数据库,这是一个功能强大的关系型数据库。
  • 实时功能:通过 PostgreSQL 的复制功能,Supabase 可以实时推送数据库变更。
  • 身份验证:提供用户注册、登录、社交登录、多因素认证等功能。
  • 存储:用于存储文件,如图片、视频等。
  • 边缘函数:类似云函数,可以在边缘运行代码。
  • 仪表盘:提供图形界面管理数据库、用户、存储等。

3. 开始使用 Supabase

3.1 创建项目

  1. 访问 Supabase 官网 并注册账号。
  2. 登录后,点击“New Project”创建新项目。
  3. 填写项目信息,包括数据库名称(默认为postgres)、密码、地区等,然后创建。

3.2 获取 API 密钥

创建项目后,进入项目仪表盘,在“Settings” -> “API”中可以找到:

  • Project URL:你的 Supabase 项目的 URL。
  • anon public key:公开密钥,用于客户端。
  • service_role key:服务角色密钥,用于服务器端,拥有所有权限。

4. 使用 Supabase 客户端库

Supabase 提供多种客户端库,如 JavaScript、Dart(Flutter)、Python 等。这里以 JavaScript 为例。

4.1 安装

npm install @supabase/supabase-js

4.2 初始化

import { createClient } from "@supabase/supabase-js";

const supabaseUrl = "YOUR_SUPABASE_URL";
const supabaseAnonKey = "YOUR_SUPABASE_ANON_KEY";

const supabase = createClient(supabaseUrl, supabaseAnonKey);

5. 数据库操作

5.1 创建表

在 Supabase 仪表盘中,点击“Table Editor” -> “New table”创建表。例如,创建一个todos表:

  • id (int8, primary key)
  • title (text)
  • is_completed (bool)

5.2 插入数据

async function insertTodo() {
  const { data, error } = await supabase
    .from("todos")
    .insert([{ title: "学习Supabase", is_completed: false }]);

  if (error) {
    console.error("插入错误", error);
  } else {
    console.log("插入成功", data);
  }
}

5.3 查询数据

async function fetchTodos() {
  const { data, error } = await supabase.from("todos").select("*");

  if (error) {
    console.error("查询错误", error);
  } else {
    console.log("查询结果", data);
  }
}

5.4 更新数据

async function updateTodo(id, newTitle) {
  const { data, error } = await supabase
    .from("todos")
    .update({ title: newTitle })
    .eq("id", id);

  if (error) {
    console.error("更新错误", error);
  } else {
    console.log("更新成功", data);
  }
}

5.5 删除数据

async function deleteTodo(id) {
  const { data, error } = await supabase.from("todos").delete().eq("id", id);

  if (error) {
    console.error("删除错误", error);
  } else {
    console.log("删除成功", data);
  }
}

6. 实时功能

Supabase 利用 PostgreSQL 的复制功能提供实时订阅。例如,监听todos表的变化:

const todoSubscription = supabase
  .from("todos")
  .on("INSERT", (payload) => {
    console.log("新记录插入", payload);
  })
  .on("UPDATE", (payload) => {
    console.log("记录更新", payload);
  })
  .subscribe();

// 取消订阅
// todoSubscription.unsubscribe()

7. 身份验证

Supabase 提供多种身份验证方式,如邮箱密码、社交登录(Google、GitHub 等)。

7.1 注册用户

async function signUp(email, password) {
  const { data, error } = await supabase.auth.signUp({
    email,
    password,
  });

  if (error) {
    console.error("注册错误", error);
  } else {
    console.log("注册成功", data);
  }
}

7.2 登录

async function signIn(email, password) {
  const { data, error } = await supabase.auth.signInWithPassword({
    email,
    password,
  });

  if (error) {
    console.error("登录错误", error);
  } else {
    console.log("登录成功", data);
  }
}

7.3 获取当前用户

async function getCurrentUser() {
  const {
    data: { user },
    error,
  } = await supabase.auth.getUser();

  if (error) {
    console.error("获取用户错误", error);
  } else {
    console.log("当前用户", user);
  }
}

7.4 登出

async function signOut() {
  const { error } = await supabase.auth.signOut();

  if (error) {
    console.error("登出错误", error);
  } else {
    console.log("登出成功");
  }
}

8. 存储文件

8.1 上传文件

async function uploadFile(file) {
  const { data, error } = await supabase.storage
    .from("bucket_name") // 替换为你的存储桶名称
    .upload("file_path", file);

  if (error) {
    console.error("上传错误", error);
  } else {
    console.log("上传成功", data);
  }
}

8.2 获取文件 URL

async function getFileUrl(path) {
  const { data } = supabase.storage.from("bucket_name").getPublicUrl(path);

  return data.publicUrl;
}

9. 行级安全(RLS)

Supabase 使用 PostgreSQL 的行级安全策略来控制数据访问。在仪表盘中,可以为表设置策略。

例如,只允许用户查看自己的记录:

  1. 在“Authentication” -> “Policies”中,为todos表创建新策略。
  2. 设置策略名称,如“Users can view own todos”。
  3. 在“USING”表达式中添加:
    auth.uid() = user_id
    (注意:假设表中有一个user_id字段存储用户 ID)

10. 边缘函数

Supabase 边缘函数允许你在边缘运行代码,处理请求。

10.1 创建函数

在项目目录中,运行:

supabase functions new hello-world

这将在supabase/functions/hello-world/index.ts中创建一个函数模板。

10.2 部署函数

supabase functions deploy hello-world

10.3 调用函数

const { data, error } = await supabase.functions.invoke("hello-world", {
  body: { name: "Supabase" },
});

11. 总结

以上是 Supabase 的基本使用方法。Supabase 提供了强大的功能,使得构建全栈应用变得简单。你可以通过官方文档(https://supabase.com/docs)获取更多详细信息。

现在,你可以尝试创建一个简单的应用,例如一个待办事项列表,结合数据库、身份验证和实时功能,来加深理解。 ::: 学习 Supabase 是一个很好的选择!它是一个开源的 Firebase 替代方案,提供数据库、身份验证、实时功能、存储等后端服务。以下是系统化的学习路径和关键知识点:


一、Supabase 是什么?

  • 核心定位:基于 PostgreSQL 的后端即服务(BaaS),提供:
    • 实时数据库(PostgreSQL)
    • 用户身份验证
    • 文件存储
    • 实时订阅
    • 无服务器函数(Edge Functions)
  • 优势:开源、SQL 灵活、与 PostgreSQL 生态无缝集成。

二、学习路径

1. 基础概念

  • PostgreSQL 基础
    • 理解表、行、列、主键、外键。
    • 基础 SQL 查询(SELECT, INSERT, UPDATE, DELETE)。
  • Supabase 架构
    • 每个项目 = 1 个 PostgreSQL 数据库 + 1 组 Supabase 服务。
    • 通过 仪表盘(Dashboard) 管理项目。

2. 快速上手

  • 创建项目
    1. 注册 Supabase 账号
    2. 新建项目 → 获取 URLanon key(用于客户端连接)。
  • 连接数据库
    import { createClient } from "@supabase/supabase-js";
    const supabase = createClient("YOUR_SUPABASE_URL", "YOUR_SUPABASE_ANON_KEY");

3. 核心功能实战

(1) 数据库操作
  • 创建表(通过仪表盘或 SQL):

    CREATE TABLE todos (
      id SERIAL PRIMARY KEY,
      title TEXT,
      is_completed BOOLEAN DEFAULT FALSE
    );
  • 增删改查

    // 插入数据
    const { data, error } = await supabase
      .from("todos")
      .insert([{ title: "学习 Supabase" }]);
    
    // 查询数据
    const { data: todos } = await supabase
      .from("todos")
      .select("*")
      .eq("is_completed", false);
(2) 实时订阅
  • 监听数据变化:
    const subscription = supabase
      .from("todos")
      .on("INSERT", (payload) => {
        console.log("新数据:", payload.new);
      })
      .subscribe();
(3) 用户认证
  • 注册/登录

    // 注册
    const { user, error } = await supabase.auth.signUp({
      email: "user@example.com",
      password: "password123",
    });
    
    // 登录
    const { user, error } = await supabase.auth.signInWithPassword({
      email: "user@example.com",
      password: "password123",
    });
  • 保护数据:使用 行级安全策略(RLS) 限制用户访问自己的数据。

(4) 文件存储
  • 上传/下载文件:

    // 上传
    const { data, error } = await supabase.storage
      .from("avatars")
      .upload("public/avatar1.png", file);
    
    // 获取公开 URL
    const { publicURL } = supabase.storage
      .from("avatars")
      .getPublicUrl("avatar1.png");
(5) Edge Functions(无服务器函数)
  • 创建函数(需安装 CLI):
    supabase functions new hello-world
  • 部署并调用:
    const { data, error } = await supabase.functions.invoke("hello-world", {
      body: { name: "Supabase" },
    });

4. 高级功能

  • 数据库扩展:启用 PostGIS(地理数据)、pgvector(向量搜索)等。
  • 数据迁移:使用 pg_dump 导入现有 PostgreSQL 数据。
  • 性能优化:索引优化、连接池配置。
  • 安全:配置 RLS 策略、API 密钥管理。

三、学习资源

  1. 官方文档Supabase Docs(最权威!)
  2. 实战教程
  3. 视频教程
  4. 社区

四、常见问题

  • Q: Supabase 和 Firebase 的区别?
    A: Supabase 使用 PostgreSQL(关系型数据库),Firebase 使用 NoSQL;Supabase 开源,Firebase 闭源。

  • Q: 如何处理大量数据?
    A: 使用 PostgreSQL 的分区表、索引优化,或结合 Supabase 的读取副本。

  • Q: 是否支持移动端?
    A: 是!提供 FlutterReact Native SDK。


五、实战项目建议

  1. 待办事项应用:实现增删改查 + 用户登录 + 实时同步。
  2. 博客系统:文章管理 + 用户评论 + 文件上传(图片)。
  3. 实时聊天应用:使用实时订阅 + 存储聊天记录。

六、调试技巧

  • 查看日志:仪表盘 → Logs → 查看数据库/函数/认证日志。
  • 本地开发:使用 Supabase CLI 本地运行项目:
    supabase init
    supabase start

总结

学习 Supabase 的关键是 动手实践

  1. 从创建项目开始 → 2. 操作数据库 → 3. 添加认证 → 4. 实现实时功能 → 5. 部署上线。
    遇到问题多查文档和社区,Supabase 的生态正在快速发展,保持跟进最新功能!

AI编程训练营

联系勋荣

      - 一对一指导
      - AI编程,AI项目实战
      - 课程价格:850元
      - 添加微信codexun咨询