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 自动推送)

相关推荐
葫芦和十三2 小时前
图解 MongoDB 23|两地三中心:跨可用区部署怎么扛机房故障
后端·mongodb·agent
勇哥java实战分享4 小时前
PaddleOCR 太慢?我换成 RapidOCR 后,速度直接起飞
后端
苏三说技术8 小时前
LangChain4j 和 LangGraph4j,哪个更好?
后端
ServBay9 小时前
7 个AI开发中真正用得上的 MCP Server,配合Claude Code食用效果更佳
后端·claude·mcp
妙码生花9 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
用户67570498850210 小时前
Go 语言里判断字符串为空,90% 的人都写错了!
后端·go
用户67570498850210 小时前
Go 进阶必修:90% 的人都没用对的“表驱动法”
后端·go
小兔崽子去哪了10 小时前
Java 生成二维码解决方案
java·后端
苍何10 小时前
懂事的 Agent 已经开始自己看屏幕干活了,效率起飞!
后端