数据库迁移
如何管理Supabase项目的模式迁移
数据库迁移是指创建、更新或删除现有数据库模式的SQL语句。这是一种常用的方式来跟踪数据库随时间的变化。
数据库模式迁移
在本指南中,我们将创建一个名为 employees
的表,并演示如何对其进行修改。
您需要先安装 Supabase CLI 并启动本地开发环境。
创建第一个迁移文件
首先,生成一个新的迁移文件来存储创建 employees
表所需的SQL语句。
Terminal
1supabase migration new create_employees_table
向迁移文件添加SQL语句
这将在supabase/migrations目录中创建一个新的迁移文件。
在该文件中添加创建 employees
表的SQL语句。
supabase/migrations/<timestamp>_create_employees_table.sql
123456create table if not exists employees ( id bigint primary key generated always as identity, name text not null, email text, created_at timestamptz default now());
应用第一个迁移
运行此迁移以创建 employees
表。
现在您可以在本地仪表板中查看新建的 employees
表。
Terminal
1supabase migration up
修改员工表
接下来,通过添加 department
列来修改您的 employees
表。
Terminal
1supabase migration new add_department_column
向表添加新列
在新的迁移文件中添加创建 department
列的SQL语句。
supabase/migrations/<timestamp>_add_department_column.sql
12alter table if exists public.employeesadd department text default 'Hooli';
应用第二个迁移
运行此迁移以更新现有的 employees
表。
Terminal
1supabase migration up
最后,您应该在本地仪表板中看到 employees
表已添加了 department
列。
在GitHub上查看此示例的完整代码。
数据种子填充
既然您已经通过迁移脚本管理数据库,那么每次重置数据库时使用一些种子数据将会非常有用。
填充数据表
在 supabase/seed.sql 中创建种子脚本。
在该文件中添加向 employees
表插入数据的 SQL 语句。
supabase/seed.sql
123456insert into public.employees (name)values ('Erlich Bachman'), ('Richard Hendricks'), ('Monica Hall');
重置数据库
重置数据库以重新应用迁移并用种子数据填充。
Terminal
1supabase db reset
现在您应该在控制面板中看到 employees
表以及种子数据了!所有的数据库变更都被记录在代码中,您可以随时重置到已知状态,并包含种子数据。
差异比对变更
如果您熟悉SQL并能够自如地创建表和列,这个工作流程非常适用。如果不熟悉,您仍然可以使用仪表板创建表和列,然后通过CLI比对变更并生成迁移文件。
Terminal
1supabase db diff -f create_cities_table
将模式差异添加为迁移
系统会自动为您创建新的迁移文件。
您也可以直接从表编辑器中复制表定义。
supabase/migrations/<timestamp>_create_cities_table.sql
12345create table "public"."cities" ( "id" bigint primary key generated always as identity, "name" text, "population" bigint);
测试迁移
通过重置本地数据库来测试新的迁移文件。
Terminal
1supabase db reset
最后一步是将这些变更部署到实际的Supabase项目中。
部署您的项目
您一直在本地开发项目,通过迁移(migration)对表结构进行修改。现在是时候将项目部署到Supabase平台,开始扩展到数百万用户了!
前往Supabase创建一个新项目进行部署。
当您在Supabase上访问已部署的项目时,将会看到一个新的employees
表,其中包含您在上文第二个迁移中添加的department
列。