PlanetScale 分支工作流 #
本章将介绍 PlanetScale 数据库分支的最佳工作流程,帮助团队高效协作进行 Schema 变更。
工作流概览 #
Git 风格工作流 #
text
┌─────────────────────────────────────────────────────────────┐
│ 类似 Git 的工作流 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 代码分支(Git) 数据库分支(PlanetScale) │
│ │
│ main main (生产) │
│ │ │ │
│ ├── feature/auth ├── feature/auth-schema │
│ │ └── PR │ └── Deploy Request │
│ │ │ │
│ ├── feature/orders ├── feature/orders-schema │
│ │ └── PR │ └── Deploy Request │
│ │ │ │
│ └── hotfix/bug └── hotfix/bug-schema │
│ └── PR └── Deploy Request │
│ │
│ 核心理念: │
│ - 每个 Schema 变更对应一个分支 │
│ - 变更通过 Deploy Request 审核 │
│ - 合并后删除开发分支 │
│ │
└─────────────────────────────────────────────────────────────┘
工作流程图 #
text
┌─────────────────────────────────────────────────────────────┐
│ 完整工作流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 开发阶段 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 创建分支 │────>│ 修改Schema│────>│ 本地测试 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ 2. 审核阶段 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 创建 DR │────>│ 团队审核 │────>│ 批准变更 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ 3. 部署阶段 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 部署变更 │────>│ 验证结果 │────>│ 删除分支 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
功能开发工作流 #
标准流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 功能开发流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:添加用户认证功能 │
│ │
│ 步骤 1:创建数据库分支 │
│ $ pscale branch create my-app feature/auth-tables │
│ │
│ 步骤 2:连接并修改 Schema │
│ $ pscale shell my-app feature/auth-tables │
│ │
│ mysql> CREATE TABLE users ( │
│ -> id INT AUTO_INCREMENT PRIMARY KEY, │
│ -> email VARCHAR(255) UNIQUE NOT NULL, │
│ -> password_hash VARCHAR(255) NOT NULL, │
│ -> created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP │
│ -> ); │
│ │
│ mysql> CREATE TABLE sessions ( │
│ -> id VARCHAR(255) PRIMARY KEY, │
│ -> user_id INT NOT NULL, │
│ -> expires_at TIMESTAMP NOT NULL, │
│ -> INDEX idx_user (user_id) │
│ -> ); │
│ │
│ 步骤 3:创建 Deploy Request │
│ $ pscale deploy-request create my-app feature/auth-tables│
│ │
│ 步骤 4:团队审核 │
│ - 查看 Schema 差异 │
│ - 检查设计合理性 │
│ - 提出修改建议 │
│ │
│ 步骤 5:部署变更 │
│ $ pscale deploy-request deploy my-app 1 │
│ │
│ 步骤 6:清理分支 │
│ $ pscale branch delete my-app feature/auth-tables │
│ │
└─────────────────────────────────────────────────────────────┘
与代码同步 #
text
┌─────────────────────────────────────────────────────────────┐
│ 代码与数据库同步 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 推荐做法: │
│ │
│ 1. 代码分支与数据库分支对应 │
│ git checkout -b feature/auth │
│ pscale branch create my-app feature/auth │
│ │
│ 2. 同时开发代码和 Schema │
│ - 修改应用代码 │
│ - 修改数据库 Schema │
│ - 本地测试 │
│ │
│ 3. 同时提交审核 │
│ - 创建 GitHub PR │
│ - 创建 Deploy Request │
│ │
│ 4. 按顺序合并 │
│ - 先部署 Schema 变更 │
│ - 再合并代码 │
│ │
│ 流程图: │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Git Branch │ │ DB Branch │ │
│ │ feature/auth │ │ feature/auth │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ GitHub PR │ │ Deploy Req │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ │ ┌──────────────┘ │
│ │ │ 先部署 Schema │
│ │ ▼ │
│ │ ┌──────────────┐ │
│ │ │ Deploy │ │
│ │ └──────────────┘ │
│ │ │
│ ▼ 再合并代码 │
│ ┌──────────────┐ │
│ │ Merge PR │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
紧急修复工作流 #
Hotfix 流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 紧急修复流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:生产环境发现紧急问题 │
│ │
│ 步骤 1:创建 hotfix 分支 │
│ $ pscale branch create my-app hotfix/add-missing-index │
│ │
│ 步骤 2:快速修复 │
│ $ pscale shell my-app hotfix/add-missing-index │
│ mysql> CREATE INDEX idx_email ON users(email); │
│ │
│ 步骤 3:快速审核 │
│ $ pscale deploy-request create my-app hotfix/... │
│ │
│ 步骤 4:立即部署 │
│ $ pscale deploy-request deploy my-app 5 │
│ │
│ 步骤 5:清理 │
│ $ pscale branch delete my-app hotfix/add-missing-index │
│ │
│ 注意事项: │
│ - hotfix 分支命名清晰 │
│ - 变更要小而聚焦 │
│ - 部署后验证效果 │
│ - 记录问题和解决方案 │
│ │
└─────────────────────────────────────────────────────────────┘
团队协作 #
多人协作场景 #
text
┌─────────────────────────────────────────────────────────────┐
│ 团队协作示例 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:3 人团队同时开发不同功能 │
│ │
│ 开发者 A:用户功能 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 分支:feature/user-profile │ │
│ │ 变更:添加用户资料表 │ │
│ │ 状态:开发中 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 开发者 B:订单功能 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 分支:feature/orders │ │
│ │ 变更:添加订单相关表 │ │
│ │ 状态:等待审核 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 开发者 C:报表功能 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 分支:feature/reports │ │
│ │ 变更:添加报表统计表 │ │
│ │ 状态:已部署 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 协作要点: │
│ - 各自独立分支开发 │
│ - 变更互不影响 │
│ - 按顺序部署 │
│ │
└─────────────────────────────────────────────────────────────┘
冲突处理 #
text
┌─────────────────────────────────────────────────────────────┐
│ 冲突场景处理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:两个分支修改同一表 │
│ │
│ 分支 A:feature/add-phone │
│ ALTER TABLE users ADD COLUMN phone VARCHAR(20); │
│ │
│ 分支 B:feature/add-address │
│ ALTER TABLE users ADD COLUMN address TEXT; │
│ │
│ 处理方式: │
│ │
│ 1. 先部署分支 A │
│ $ pscale deploy-request deploy my-app 1 │
│ │
│ 2. 更新分支 B │
│ $ pscale branch delete my-app feature/add-address │
│ $ pscale branch create my-app feature/add-address-v2 │
│ $ pscale shell my-app feature/add-address-v2 │
│ mysql> ALTER TABLE users ADD COLUMN address TEXT; │
│ │
│ 3. 再部署分支 B │
│ $ pscale deploy-request create my-app feature/... │
│ $ pscale deploy-request deploy my-app 2 │
│ │
└─────────────────────────────────────────────────────────────┘
CI/CD 集成 #
GitHub Actions 集成 #
yaml
name: Database Schema Check
on:
pull_request:
branches: [main]
jobs:
schema-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install PlanetScale CLI
run: |
curl -fsSL https://raw.githubusercontent.com/planetscale/cli/main/install.sh | bash
- name: Authenticate
env:
PLANETSCALE_SERVICE_TOKEN: ${{ secrets.PLANETSCALE_SERVICE_TOKEN }}
run: |
pscale auth login --service-token $PLANETSCALE_SERVICE_TOKEN
- name: Create branch
run: |
pscale branch create my-app pr-${{ github.event.pull_request.number }} \
--from main \
--org my-org
- name: Apply schema changes
run: |
pscale shell my-app pr-${{ github.event.pull_request.number }} < schema.sql
- name: Create deploy request
run: |
pscale deploy-request create my-app pr-${{ github.event.pull_request.number }}
自动化部署流程 #
text
┌─────────────────────────────────────────────────────────────┐
│ 自动化流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 触发条件:PR 合并到 main │
│ │
│ ┌─────────────┐ │
│ │ PR Merged │ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 检查是否有 │ │
│ │ 待部署 DR │ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 自动部署 │────>│ 验证部署 │ │
│ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 清理分支 │ │
│ └─────────────┘ │
│ │
│ GitHub Actions 示例: │
│ - name: Deploy schema changes │
│ run: | │
│ DR_NUMBER=$(pscale deploy-request list my-app \ │
│ --format json | jq '.[0].number') │
│ pscale deploy-request deploy my-app $DR_NUMBER │
│ │
└─────────────────────────────────────────────────────────────┘
最佳实践 #
分支命名规范 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分支命名规范 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 功能开发: │
│ feature/<功能名称> │
│ ├── feature/user-auth │
│ ├── feature/order-system │
│ └── feature/payment-integration │
│ │
│ Bug 修复: │
│ fix/<问题描述> │
│ ├── fix/user-email-unique │
│ └── fix/order-index │
│ │
│ 紧急修复: │
│ hotfix/<问题描述> │
│ ├── hotfix/critical-index │
│ └── hotfix/security-patch │
│ │
│ 实验/测试: │
│ exp/<实验名称> │
│ └── exp/new-index-strategy │
│ │
│ 与 PR 关联: │
│ pr/<PR编号> │
│ └── pr/123 │
│ │
└─────────────────────────────────────────────────────────────┘
变更审核清单 #
text
┌─────────────────────────────────────────────────────────────┐
│ 审核清单 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Schema 设计: │
│ □ 表名和列名是否规范 │
│ □ 数据类型是否合适 │
│ □ 是否需要索引 │
│ □ 是否考虑了扩展性 │
│ │
│ 兼容性: │
│ □ 是否影响现有数据 │
│ □ 是否需要数据迁移 │
│ □ 应用代码是否已更新 │
│ │
│ 性能: │
│ □ 是否添加了必要索引 │
│ □ 是否可能影响查询性能 │
│ □ 大表变更是否需要特殊处理 │
│ │
│ 安全: │
│ □ 是否涉及敏感数据 │
│ □ 是否需要更新权限 │
│ │
└─────────────────────────────────────────────────────────────┘
下一步 #
现在你已经掌握了分支工作流,接下来学习 部署请求,深入了解变更审批流程!
最后更新:2026-03-29