PlanetScale

Serverless MySQL with branching - git-like workflows, zero-downtime migrations, infinite scale

TL;DR

What: A serverless MySQL platform with branching and non-blocking schema changes.

Why: Git-like branching for databases, zero-downtime migrations, infinite scalability.

Quick Start

Sign up: Go to planetscale.com and create an account.

Install CLI:

brew install planetscale/tap/pscale  # macOS
# or
scoop install pscale  # Windows

Create database:

pscale auth login
pscale database create myapp --region us-east

Connect:

pscale shell myapp main

Create table:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) UNIQUE
);

Cheatsheet

CommandDescription
pscale database create nameCreate database
pscale shell db branchConnect to branch
pscale branch create db nameCreate branch
pscale deploy-request create db branchCreate deploy request
pscale connect db branchLocal connection proxy
pscale password create db branch nameCreate connection password

Gotchas

Branching workflow

# Create development branch
pscale branch create myapp add-orders

# Connect to branch
pscale shell myapp add-orders

# Make schema changes
CREATE TABLE orders (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT,
  total DECIMAL(10,2)
);

# Create deploy request
pscale deploy-request create myapp add-orders

# Deploy to production (via UI or CLI)
pscale deploy-request deploy myapp 1

Connection strings

# Generate connection string
pscale password create myapp main production-password

# Use in application
DATABASE_URL="mysql://user:password@host/database?ssl=true"

Use with frameworks

// Prisma
// schema.prisma
datasource db {
  provider     = "mysql"
  url          = env("DATABASE_URL")
  relationMode = "prisma"  // Required for PlanetScale
}

// Drizzle
import { drizzle } from 'drizzle-orm/planetscale-serverless';
import { connect } from '@planetscale/database';

const connection = connect({
  url: process.env.DATABASE_URL
});
const db = drizzle(connection);

No foreign keys (use application-level)

// PlanetScale doesn't support foreign keys for online migrations
// Handle relationships in application code

// With Prisma relationMode: "prisma"
model User {
  id     Int     @id @default(autoincrement())
  orders Order[]
}

model Order {
  id     Int  @id @default(autoincrement())
  userId Int
  user   User @relation(fields: [userId], references: [id])
}

Next Steps