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