本地开发

使用模式迁移进行本地开发

使用 Supabase CLI 和模式迁移进行本地开发。


Supabase 是一个灵活的平台,让您可以决定如何构建您的项目。 您可以直接使用控制台快速启动,或使用适当的本地设置。 我们建议您在本地工作并将更改部署到 Supabase 平台上的关联项目。

使用 CLI 在本地运行 Supabase 堆栈进行本地开发。 您可以使用集成的 Studio 控制台进行更改,然后将更改捕获到模式迁移文件中,这些文件可以保存在版本控制中。

或者,如果您熟悉迁移文件和 SQL,可以在推送到本地数据库进行测试之前编写自己的迁移并共享您的更改。

数据库迁移#

数据库更改通过“迁移”进行管理。 数据库迁移是一种跟踪数据库随时间变化的总览方式。

对于本指南,我们将创建一个名为 employees 的表,并了解如何对其进行更改。

1

创建您的第一个迁移文件

要开始,请生成一个 新的迁移来存储创建我们的 employees 表所需的 SQL。

终端
1
supabase migration new create_employees_table
2

将 SQL 添加到您的迁移文件

这将创建一个新的迁移:supabase/migrations/<timestamp> _create_employees_table.sql。

将创建 employees 表的 SQL 添加到该文件

20250101000000_create_employees_table.sql
1
create table employees (
2
id bigint primary key generated always as identity,
3
name text,
4
email text,
5
created_at timestamptz default now()
6
);
3

应用您的迁移

现在您已经有了迁移文件,您可以运行此迁移并创建 employees 表。

在这里使用 reset 命令将数据库重置为当前的迁移

终端
1
supabase db reset
4

修改您的 employees 表

现在您可以在控制台中访问新的 employees 表。

接下来,通过添加一个部门列来修改您的 employees 表。 为此创建一个新的迁移文件。

终端
1
supabase migration new add_department_to_employees_table
5

向您的表中添加新列

这将创建一个新的迁移文件:supabase/migrations/<timestamp> _add_department_to_employees_table.sql。

将创建新部门列的 SQL 添加到该文件

20250101000001_add_department_to_employees_table.sql
1
alter table if exists public.employees
2
add department text default 'Hooli';

添加示例数据#

现在您正在使用迁移脚本管理数据库,每次重置数据库时都拥有一些种子数据会很棒。

为此,您可以在 supabase/seed.sql 中创建一个种子脚本。

1

填充您的表

使用您的 supabase/seed.sql 文件将数据插入到您的 employees 表中。

supabase/seed.sql
1
insert into public.employees
2
(name)
3
values
4
('Erlich Bachman'),
5
('Richard Hendricks'),
6
('Monica Hall');
2

重置您的数据库

重置您的数据库(应用当前迁移),并填充种子数据

终端
1
supabase db reset

您现在应该看到 employees 表以及控制台中的种子数据! 您的所有数据库更改都以代码形式捕获,并且您可以随时重置为已知状态,并包含种子数据。

比较更改#

如果了解 SQL 并且熟悉创建表和列,此工作流程会很好。 否则,您仍然可以使用控制台创建表和列,然后使用 CLI 比较您的更改并创建迁移。

创建一个名为 cities 的新表,其中包含列 idnamepopulation。 要查看此对应的 SQL,您可以使用 supabase db diff --schema public 命令。 这将显示运行以创建表和列的 SQL。 supabase db diff 的输出如下所示

1
Diffing schemas: public
2
Finished supabase db diff on branch main.
3
4
create table "public"."cities" (
5
"id" bigint primary key generated always as identity,
6
"name" text,
7
"population" bigint
8
);

或者,您可以直接从表格编辑器查看您的表格定义

SQL Definition

然后,您可以将此 SQL 复制到新的迁移文件中,并运行 supabase db reset 以应用更改。

最后一步是将这些更改部署到实时 Supabase 项目。

部署您的项目#

您一直在本地开发您的项目,通过迁移更改您的表。 现在是时候将您的项目部署到 Supabase 平台并开始扩展到数百万用户了! 前往 Supabase 并创建一个新项目进行部署。

登录到 Supabase CLI#

1
supabase login

使用 supabase link 将您的项目与远程项目关联。

1
supabase link --project-ref <project-id>
2
# You can get <project-id> from your project's dashboard URL: https://supabase.org.cn/dashboard/project/<project-id>
3
4
supabase db pull
5
# Capture any changes that you have made to your remote database before you went through the steps above
6
# If you have not made any changes to the remote database, skip this step

supabase/migrations 现在填充了 <timestamp>_remote_schema.sql 中的一个迁移。 此迁移捕获使您的本地数据库与远程 Supabase 项目的模式匹配所需的任何更改。

查看生成的迁移文件,确认无误后,将其应用到您的本地实例

1
# To apply the new migration to your local database:
2
supabase migration up
3
4
# To reset your local database completely:
5
supabase db reset

部署数据库更改#

使用 db push 部署任何本地数据库迁移

1
supabase db push

访问 Supabase 上的实时项目,您将看到一个新的 employees 表,其中包含您在第二个迁移中添加的 department 列。

部署边缘函数#

如果您的项目使用边缘函数,可以使用 functions deploy 部署它们

1
supabase functions deploy <function_name>

在本地使用 Auth#

要在本地使用 Auth,请更新运行 supabase init 后创建的项目 supabase/config.toml 文件。 添加您想要的任何提供程序,并将 enabled 设置为 true

1
[auth.external.github]
2
enabled = true
3
client_id = "env(SUPABASE_AUTH_GITHUB_CLIENT_ID)"
4
secret = "env(SUPABASE_AUTH_GITHUB_SECRET)"
5
redirect_uri = "https://:54321/auth/v1/callback"

作为最佳实践,任何机密值都应从环境变量加载。 您可以将它们添加到项目根目录中的 .env 文件中,以便 CLI 自动替换它们。

1
SUPABASE_AUTH_GITHUB_CLIENT_ID="redacted"
2
SUPABASE_AUTH_GITHUB_SECRET="redacted"

要使这些更改生效,您需要再次运行 supabase stopsupabase start

如果您在 auth 模式上定义了额外的触发器或 RLS 策略,您可以将它们作为本地迁移文件拉取。

1
supabase db pull --schema auth

同步存储桶#

通过指定 storage 模式,可以本地拉取存储桶上的 RLS 策略。 例如,

1
supabase db pull --schema storage

存储桶和对象本身是存储表中的行,因此它们不会出现在您的模式中。 您可以通过 supabase/config.toml 文件来定义它们。 例如,

1
[storage.buckets.images]
2
public = false
3
file_size_limit = "50MiB"
4
allowed_mime_types = ["image/png", "image/jpeg"]
5
objects_path = "./images"

这将使用一个命令从 supabase/images 目录将文件上传到项目中的名为 images 的存储桶。

1
supabase seed buckets

使用 --schema 同步任何模式#

可以使用以下 --schema 选项将数据库与特定模式同步

1
supabase db pull --schema <schema_name>

限制和注意事项#

本地开发环境不如 Supabase 平台功能完整。 以下是一些差异

  • 您无法在控制台中更新项目设置。 这必须使用本地配置文件完成。
  • CLI 版本决定了本地使用的 Studio 版本,因此请确保您的本地 Supabase CLI 保持最新。 我们不断添加新功能和错误修复。