声明式数据库模式
集中管理数据库模式并生成版本化迁移。
概述
声明式模式提供了一种对开发者友好的方式来维护模式迁移。
迁移传统上是命令式管理的(您需要提供如何具体更改数据库的指令)。这可能导致相关信息分散在多个迁移文件中。而使用声明式模式,您只需声明期望的数据库状态,系统会自动为您生成相应的指令。
模式迁移
模式迁移是使用数据定义语言(DDL)编写的SQL语句。它们被版本化存储在您的supabase/migrations
目录中,以确保本地和远程环境之间的模式一致性。
声明您的数据库模式
创建第一个模式文件
在 supabase/schemas
目录下创建一个 SQL 文件,定义 employees
表。
1234create table "employees" ( "id" integer not null, "name" text);
在对比模式差异前,请确保本地数据库已停止运行。
生成迁移文件
通过对比声明的模式来生成迁移文件。
1supabase db diff -f create_employees_table
启动本地数据库并应用迁移
启动本地数据库,然后应用迁移文件以在本地仪表盘中查看模式变更。
1supabase start && supabase migration up
更新数据库架构
停止本地数据库
在更新架构文件前,请先停止本地开发环境。
1supabase stop
添加新列
编辑 supabase/schemas/employees.sql
文件,为 employees
表添加新列。
12345create table "employees" ( "id" integer not null, "name" text, "age" smallint not null);
某些实体(如视图和枚举)要求列按特定顺序声明。为避免混乱的差异对比,请始终将新列添加到表的末尾。
生成新迁移
将现有迁移与声明的架构进行差异对比。
1supabase db diff -f add_age
检查生成的迁移
确认生成的迁移只包含一个增量变更。
1alter table "public"."employees" add column "age" smallint not null;
应用待处理迁移
启动本地数据库并应用待处理的迁移。
1supabase start && supabase migration up
部署您的模式变更
管理依赖关系
随着数据库模式的发展,您可能会开始使用更高级的实体,如视图和函数。这些实体在使用纯迁移文件管理时非常冗长,因为任何变更都需要重新创建整个实体。通过声明式模式,您现在可以直接就地编辑它们,这使得代码审查变得更加容易。
12345678910111213141516create table "employees" ( "id" integer not null, "name" text, "age" smallint not null);create view "profiles" as select id, name from "employees";create function "get_age"(employee_id integer) RETURNS smallint LANGUAGE "sql"AS $$ select age from employees where id = employee_id;$$;
默认情况下,您的模式文件会按字典顺序执行。当多个表之间存在外键关系时,顺序非常重要,因为必须先创建父表。例如,您的 supabase
目录最终可能具有以下结构。
123456789.└── supabase/ ├── schemas/ │ ├── employees.sql │ └── managers.sql └── migrations/ ├── 20241004112233_create_employees_table.sql ├── 20241005112233_add_employee_age.sql └── 20241006112233_add_managers_table.sql
对于只有少量表的小型项目,默认的模式顺序可能已经足够。但随着项目规模扩大,您可能需要更精细地控制模式应用的顺序。要在 config.toml
中指定自定义的应用顺序,您可以显式声明它们。任何通配符模式都会被评估、去重并按字典顺序排序。例如,以下模式确保 employees.sql
始终优先执行。
12345[db.migrations]schema_paths = [ "./schemas/employees.sql", "./schemas/*.sql",]
导入生产环境架构
要在现有项目上设置声明式架构,您可以通过运行以下命令导入生产环境架构:
1supabase db dump > supabase/schemas/prod.sql
之后,您可以开始将架构分解为更小的文件并生成迁移。您可以一次性完成此操作,也可以在修改架构时逐步进行。
回滚架构变更
在开发过程中,您可能希望回滚迁移以将新的架构变更保留在单个迁移文件中。这可以通过将本地数据库重置到先前版本来实现。
1supabase db reset --version 20241005112233
重置后,您可以编辑架构并重新生成新的迁移文件。请注意,您不应重置已部署到生产环境的版本。
如果需要回滚已部署的迁移,您应该首先还原对架构文件的更改。然后可以生成包含向下迁移的新迁移文件。这确保您的生产环境迁移始终向前滚动。
向下迁移中生成的SQL语句通常具有破坏性。您必须仔细审查它们以避免意外数据丢失。
已知注意事项
用于生成架构差异的migra
差异工具能够跟踪大多数数据库变更。但在某些边缘情况下可能会失败。
如果您需要使用以下任何实体,请记住通过版本化迁移来添加它们。
数据操作语言
- 诸如
insert
、update
、delete
等DML语句不会被架构差异捕获
视图所有权
RLS策略
其他实体
- 模式权限未被跟踪,因为每个模式都是单独差异化的
- 注释未被跟踪
- 分区未被跟踪
alter publication ... add table ...
- 创建域语句被忽略
- 授权语句会从默认权限中重复生成