这两天在对接 Supabase 的数据库,了解到 Supabase 支持通过 supabase-cli 来使用 migration,因此把官网的相关文档都看了一遍。
但是官方的文档有点乱,一会儿是在 Studio 中创建表、一会儿手工创建 migration,一会儿又通过 diff 来生成,然后还有 supabase/scheams/,晕菜了。
在认真研究并本地测试之后,简单总结一下我的开发实践。
开发环境:
-
Macbook Pro Apple M3
-
brew
-
Docker Desktop
0x01. 安装 supabase-cli 工具
bash
brew install supabase/tap/supabase
0x02. 给项目初始化 supabase 环境
sql
supabase initsupabase start
start 执行完成之后,本地docker会运行一套supabase环境,其中包括一个纯净的supabase db。
0x03. migration的生成方式
创建 migration 文件有两种方式:手工编写和自动生成,推荐使用自动创建migration的方式。
声明式定义schema
新版本的 supabase-cli 支持声明式定义schema,即在 supabase/scheams/ 目录下,写完整的schema,然后通过 supabase db diff 来创建 migration。
在 supabase db diff 的时候,如果本地存在 supabase/scheams/ 目录,则会和本地目录中定义的 schema 对比,根据差异创建 migration;否则和本地数据库来对比。
使用 supabase/scheams/ 的好处是,对于任意一个给定的 schema,所有的定义都在一个文件中,是一个完整的 schema 定义,一目了然。
自动创建 migration
三步操作:
-
创建一个新的
migration文件,比如创建新表employees:supabase migration new create_employees_table
-
执行
diff获取本地数据库的变更supabase db diff
-
把上面命令输出的
sql复制到生成的migration文件中
当然,省事点的,可以直接用diff命令把migration创建出来:
supabase db diff -f create_employees_table
0x04. migration 的工作流程
创建 migration 文件
见上一节。
将 migration 应用到本地数据库
supabase migration up
将 migration 推送到 Supabase
-
登陆
Supabasesupabase login
-
将本地环境和
Supabase中的项目关联supabase link --project-ref xxxxxx
这里的 project-ref 有两种获取方式:
-
访问
Supabase项目,从URL中获取,比如项目:https://supabase.com/dashboard/project/ejncwnlcyadphxwcnfac的project-id就是最后的ejncwnlcyadphxwcnfac。 -
执行
supabase link,从列表中选择/获取
-
将
migration推送到远程supabase db push
如果有一些数据需要执行 seed.sql 初始化,可以追加--include-seed 参数,即:
css
supabase db push --include-seed
0x05. 最佳实践
避免直接操作
Supabase线上环境。所有数据库的操作,都先在本地环境处理,生成对应的
migration;本地测试通过之后,推送到远程。
不论是自己开发,还是团队开发,使用的都是同样的流程:
-
更新代码,获取最新的
migration -
执行
supabase migration up将代码库中的新migration更新到本地数据库 -
创建新的
migration并应用到本地数据库 -
测试完成之后,将新的
migration提交到代码仓库并发起PR(个人开发可以直接commit) -
Review PR 并合并到
master分支 -
功能发布的时候,将
migration推送到线上(或者由Github Action自动推送)