这两天在对接 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
-
登陆
Supabase
supabase 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
自动推送)