pscale deploy-request
Create, review, diff, revert, and manage deploy requests for schema changes.
Common Commands
# Create deploy request from branch
pscale deploy-request create <database> <branch-name>
# List deploy requests
pscale deploy-request list <database>
# Show deploy request details
pscale deploy-request show <database> <number>
# View deploy request diff
pscale deploy-request diff <database> <number>
# Inspect reviews, storage, deployment, and operation progress
pscale deploy-request reviews <database> <number> --format json
pscale deploy-request storage-check <database> <number> --format json
pscale deploy-request deployment <database> <number> --format json
pscale deploy-request operations <database> <number> --format json
# Inspect the database-wide deployment queue
pscale deploy-request queue <database> --format json
# Unblock only after a failed deploy/revert is diagnosed and approved
pscale deploy-request unblock <database> <number> --format json
# Deploy (apply changes)
pscale deploy-request deploy <database> <number>
# Update deploy request settings (edit is an alias)
pscale deploy-request update <database> <number> --enable-auto-apply --format json
pscale deploy-request update <database> <number> --auto-delete-branch=false --format json
# Explicit strategy (parallel requires database support and approval)
pscale deploy-request deploy <database> <number> --strategy parallel --wait
# Close without deploying
pscale deploy-request close <database> <number>
# Revert deployed changes
pscale deploy-request revert <database> <number>
Workflows
Complete Schema Migration (Recommended)
This is the safest way to deploy schema changes to production:
# 1. Create development branch
pscale branch create my-database feature-schema-v2 --from main
# 2. Make schema changes
pscale shell my-database feature-schema-v2
# ... execute ALTER TABLE, etc.
# 3. Review changes locally
pscale branch diff my-database feature-schema-v2
# 4. Create deploy request
pscale deploy-request create my-database feature-schema-v2
# 5. Review deploy request diff
pscale deploy-request diff my-database 1
# 6. Deploy to production
pscale deploy-request deploy my-database 1
# 7. Verify deployment
pscale deploy-request show my-database 1
Select serial or parallel deployment
pscale deploy-request deploy accepts --strategy serial|parallel. Omit the
flag to keep the default serial strategy. Before selecting parallel, confirm
that parallel deployments are enabled and appropriate for the target database,
review the deploy-request diff, and obtain the same production-change approval
required for deployment itself. Do not use parallel merely to make an unknown
migration finish sooner.
# Preserve the default
pscale deploy-request deploy <database> <number> --strategy serial
# Use only after eligibility and operational impact are confirmed
pscale deploy-request deploy <database> <number> --strategy parallel --wait
Inspect readiness and progress
Use the read-only inspection commands before and during deployment rather than inferring state from show alone:
# Before deployment: confirm reviews and capacity
pscale deploy-request reviews <database> <number> --org <org> --format json
pscale deploy-request storage-check <database> <number> --org <org> --format json
# Understand queue placement and deployment state
pscale deploy-request queue <database> --org <org> --format json
pscale deploy-request deployment <database> <number> --org <org> --format json
# Track table/keyspace operations, including progress and ETA
pscale deploy-request operations <database> <number> --org <org> --format json
Treat enough_storage: false, a paused queue, a non-deployable deployment, or an unresolved required review as a stop condition. Do not deploy merely because one inspection endpoint is clear. During a migration, use operation state, progress_percentage, and eta_seconds as observations, not promises.
Update deploy request settings
Use canonical pscale deploy-request update; edit remains an alias. This is an operational write because auto-apply changes cutover behavior and auto-delete controls whether the source branch is deleted after a successful deploy. At least one setting flag is required, and omitted flags are not sent.
# Inspect first
pscale deploy-request show <database> <number> --org <org> --format json
pscale deploy-request deployment <database> <number> --org <org> --format json
# After explicit approval for the exact settings
pscale deploy-request update <database> <number> --org <org> \
--enable-auto-apply \
--auto-delete-branch=false \
--format json
# Verify readback
pscale deploy-request show <database> <number> --org <org> --format json
Never pass --enable-auto-apply and --disable-auto-apply together; --auto-delete-branch can be updated on its own. Use --auto-delete-branch=false to preserve the branch; --auto-delete-branch enables deletion after completion. Do not use the edit alias in prose or scripts except when explaining backwards compatibility.
Unblock after a failed deploy or revert
pscale deploy-request unblock is the CLI equivalent of the dashboard's Unblock deploy queue action. It is accepted only when the selected deployment state is complete_error or complete_revert_error. The CLI rejects pending_cutover (use apply), deploy-check error (fix the check failure), and states without a failed deploy.
# Diagnose the exact failed request and blocked queue
pscale deploy-request show <database> <number> --org <org> --format json
pscale deploy-request deployment <database> <number> --org <org> --format json
pscale deploy-request queue <database> --org <org> --format json
# After explaining the failed state and receiving explicit approval
pscale deploy-request unblock <database> <number> --org <org> --format json
# Verify the request and queue after the write
pscale deploy-request show <database> <number> --org <org> --format json
pscale deploy-request queue <database> --org <org> --format json
Unblocking does not repair the failed migration, retry it, apply a gated cutover, or resolve failed deploy checks. It marks the failed deploy/revert complete so later queue work can proceed; the API determines whether the failed action was a deploy or revert. Treat it as a production operational write and preserve the failure evidence before running it.
Manage per-deploy throttling
This throttler is scoped to one deploy request; it is separate from the database/tablet throttler under pscale branch vtctld throttler. Inspect the current eligible keyspaces and configuration first. Updating it changes live migration behavior and requires explicit approval.
pscale deploy-request throttler show <database> <number> --org <org> --format json
# One ratio for every eligible keyspace
pscale deploy-request throttler update <database> <number> --org <org> \
--ratio 50 --format json
# Or individual ratios; this mode cannot be combined with --ratio
pscale deploy-request throttler update <database> <number> --org <org> \
--configuration commerce=50 \
--configuration lookup=25 \
--format json
pscale deploy-request throttler show <database> <number> --org <org> --format json
Ratios are integers from 0 through 95: 0 effectively disables throttling and 95 slows migrations the most. Pass exactly one mode. After an approved update, re-run throttler show and verify every keyspace ratio.
Force a blocked cutover
force-cutover is only accepted when the deployment is in in_progress_cutover. It skips PlanetScale's wait (up to one hour) and kills long-running transactions blocking the table lock. This is an emergency operational write, not a routine acceleration option.
# Diagnose first
pscale deploy-request deployment <database> <number> --org <org> --format json
pscale deploy-request operations <database> <number> --org <org> --format json
# After explicit approval in an interactive terminal
pscale deploy-request force-cutover <database> <number> --org <org>
# Non-interactive execution only after the same approval
pscale deploy-request force-cutover <database> <number> --org <org> --force --format json
# Verify that cutover resumes/completes
pscale deploy-request deployment <database> <number> --org <org> --format json
pscale deploy-request operations <database> <number> --org <org> --format json
Before approval, identify the blocking deployment, explain that transactions will be killed, and confirm the expected application impact. Do not use --force merely to bypass an unavailable prompt.
Review Before Deploy
# List pending deploy requests
pscale deploy-request list <database> --state open
# Show details
pscale deploy-request show <database> <number>
# View schema diff
pscale deploy-request diff <database> <number>
# Deploy if approved
pscale deploy-request deploy <database> <number>
Revert Deployment
If a deployed schema change causes issues:
# View deployment status
pscale deploy-request show <database> <number>
# Revert the deployment
pscale deploy-request revert <database> <number>
# Verify revert
pscale deploy-request show <database> <number>
Decision Trees
Should I deploy or close?
Deploy request ready?
├─ Schema changes tested → Deploy
├─ Changes need revision → Close and create new DR from updated branch
├─ Changes no longer needed → Close
└─ Breaking changes detected → Close, fix in branch, create new DR
Should I revert?
After deployment issues?
├─ Production errors caused by schema → Revert immediately
├─ Data integrity issues → Revert, then investigate
├─ Performance degradation → Revert if severe
└─ Minor issues / non-urgent → Leave deployed, fix forward
Troubleshooting
Deploy request creation fails
Error: "No schema changes detected"
Cause: Branch schema matches production
Solution:
# Verify schema diff exists
pscale branch diff <database> <branch-name>
# If no diff, make schema changes first
pscale shell <database> <branch-name>
"Cannot deploy: conflicts detected"
Cause: Production schema changed since branch creation
Solution:
# Close conflicting deploy request
pscale deploy-request close <database> <number>
# Create a fresh branch from the current base branch
pscale branch create <database> <new-branch-name> --from main
# Reapply your schema changes to the new branch, then verify the diff
pscale branch diff <database> <new-branch-name>
# Create new deploy request
pscale deploy-request create <database> <new-branch-name>
Deploy fails midway
Error: Deployment started but failed
Solution:
# Check deploy request status
pscale deploy-request show <database> <number>
# If partially deployed, may need to revert
pscale deploy-request revert <database> <number>
# Contact PlanetScale support for stuck deployments
Cannot close deploy request
Error: "Deploy request is deployed"
Cause: Already deployed requests cannot be closed
Solution:
# Deployed requests can only be reverted
pscale deploy-request revert <database> <number>
Deploy Request States
| State | Description | Actions Available |
|---|---|---|
open |
Pending deployment | deploy, close, diff, review |
in_progress |
Currently deploying | (wait for completion) |
complete |
Successfully deployed | revert, show |
closed |
Closed without deploying | (none - read-only) |
reverted |
Deployed then reverted | (none - read-only) |
Related Skills
- pscale-branch - Create branches for deploy requests
- drizzle-kit - Generate migration SQL for schema changes
- gitlab-cli-skills - GitLab MR integration (link deploy request to MR)
Best Practices
- Always review diff before deploying (
pscale deploy-request diff) - Test schema in branch before creating deploy request
- Use descriptive names for branches (matches MR/issue number)
- Deploy during maintenance windows for breaking changes
- Have rollback plan - know how to revert
- Monitor after deployment - watch for errors
- Clean up old deploy requests - close stale ones
Automation
See scripts/deploy-schema-change.sh for complete automation:
# Automated deploy workflow
./scripts/deploy-schema-change.sh \
--database my-database \
--branch feature-schema-v2 \
--deploy
Integration with Drizzle
Common pattern for Drizzle ORM users:
# 1. Edit your schema.sql file
# 2. Create PlanetScale branch
pscale branch create my-database <branch-name>
# 3. Apply schema changes
pscale shell my-database <branch-name> < schema.sql
# 4. Create deploy request
pscale deploy-request create my-database <branch-name>
# 5. Deploy
pscale deploy-request deploy my-database <number>
# 6. Pull schema back to Drizzle
pnpm drizzle-kit introspect
# 7. Review and apply generated schema
References
See references/commands.md for complete pscale deploy-request command reference.