Supabase migration 开发实践

这两天在对接 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

三步操作:

  1. 创建一个新的 migration 文件,比如创建新表employees:

    supabase migration new create_employees_table

  2. 执行 diff 获取本地数据库的变更

    supabase db diff

  3. 把上面命令输出的sql复制到生成的migration文件中

当然,省事点的,可以直接用diff命令把migration创建出来:

复制代码
supabase db diff -f create_employees_table

0x04. migration 的工作流程

创建 migration 文件

见上一节。

将 migration 应用到本地数据库

复制代码
supabase migration up

将 migration 推送到 Supabase

  1. 登陆 Supabase

    supabase login

  2. 将本地环境和 Supabase 中的项目关联

    supabase link --project-ref xxxxxx

这里的 project-ref 有两种获取方式:

  • 访问 Supabase 项目,从 URL 中获取,比如项目:https://supabase.com/dashboard/project/ejncwnlcyadphxwcnfacproject-id 就是最后的 ejncwnlcyadphxwcnfac

  • 执行 supabase link,从列表中选择/获取

  1. migration 推送到远程

    supabase db push

如果有一些数据需要执行 seed.sql 初始化,可以追加--include-seed 参数,即:

css 复制代码
supabase db push --include-seed

0x05. 最佳实践

避免直接操作 Supabase 线上环境。

所有数据库的操作,都先在本地环境处理,生成对应的migration;本地测试通过之后,推送到远程。

不论是自己开发,还是团队开发,使用的都是同样的流程:

  1. 更新代码,获取最新的 migration

  2. 执行 supabase migration up 将代码库中的新 migration 更新到本地数据库

  3. 创建新的 migration 并应用到本地数据库

  4. 测试完成之后,将新的 migration 提交到代码仓库并发起 PR(个人开发可以直接 commit

  5. Review PR 并合并到 master 分支

  6. 功能发布的时候,将 migration 推送到线上(或者由 Github Action 自动推送)

相关推荐
weixin_456904277 小时前
Spring Boot 用户管理系统
java·spring boot·后端
cyforkk8 小时前
Spring 异常处理器:从混乱到有序,优雅处理所有异常
java·后端·spring·mvc
程序员爱钓鱼8 小时前
Go语言实战案例-开发一个Markdown转HTML工具
前端·后端·go
桦说编程9 小时前
爆赞!完全认同!《软件设计的哲学》这本书深得我心
后端
thinktik9 小时前
还在手把手教AI写代码么? 让你的AWS Kiro AI IDE直接读飞书需求文档给你打工吧!
后端·serverless·aws
老青蛙11 小时前
权限系统设计-用户设计
后端
echoyu.11 小时前
消息队列-初识kafka
java·分布式·后端·spring cloud·中间件·架构·kafka
yuluo_YX12 小时前
Go Style 代码风格规范
开发语言·后端·golang
David爱编程12 小时前
从 JVM 到内核:synchronized 与操作系统互斥量的深度联系
java·后端