PlanetScale + Drizzle
This guide shows how to create and manage PlanetScale databases with automated Drizzle migrations using Alchemy.
-
Install dependencies
Add the required dependencies to your project:
Terminal window bun add @planetscale/database drizzle-ormbun add -D drizzle-kitTerminal window npm install @planetscale/database drizzle-ormnpm install -D drizzle-kitTerminal window pnpm add @planetscale/database drizzle-ormpnpm add -D drizzle-kitTerminal window yarn add @planetscale/database drizzle-ormyarn add -D drizzle-kit -
Set credentials
Create a PlanetScale account and get your API credentials. Add them to your
.env
file:Terminal window PLANETSCALE_ORG_ID=your_organization_idPLANETSCALE_API_TOKEN=your_api_token -
Define schema
Create your database schema:
src/schema.ts import { mysqlTable, serial, varchar } from "drizzle-orm/mysql-core";export const sampleTable = mysqlTable("sample_table", {id: serial("id").primaryKey(),value: varchar("value", { length: 255 }).notNull(),}); -
Configure Drizzle
Add Drizzle configuration and scripts:
drizzle.config.ts import { defineConfig } from "drizzle-kit";export default defineConfig({out: "./drizzle",schema: "./src/schema.ts",dialect: "mysql",dbCredentials: {url: `mysql://${process.env.DATABASE_USERNAME}:${process.env.DATABASE_PASSWORD}@${process.env.DATABASE_HOST}/${process.env.DATABASE_NAME}?ssl={"rejectUnauthorized":true}`,},});package.json {"scripts": {"db:generate": "drizzle-kit generate","db:migrate": "drizzle-kit migrate","db:studio": "drizzle-kit studio"}} -
Create your infrastructure
Create
alchemy.run.ts
to provision PlanetScale resources and run migrations:/// <reference types="@types/node" />import alchemy from "alchemy";import { Database, Branch, Password } from "alchemy/planetscale";import { Exec } from "alchemy/os";const app = await alchemy("my-planetscale-app");// Create the databaseconst database = await Database("Database", {adopt: true,name: "sample-database",organizationId: process.env.PLANETSCALE_ORG_ID!,region: {slug: "us-east",},clusterSize: "PS_10",allowDataBranching: true,automaticMigrations: true,requireApprovalForDeploy: false,defaultBranch: "main",migrationFramework: "other",migrationTableName: "__drizzle_migrations",});// Create a branch for this environmentconst branch = await Branch("Branch", {adopt: true,name: `${app.name}-${app.stage}-branch`,organizationId: process.env.PLANETSCALE_ORG_ID!,databaseName: database.name,parentBranch: database.defaultBranch,isProduction: false,safeMigrations: !app.local,});// Create credentials for the branchconst password = await Password("Password", {name: `${app.name}-${app.stage}-password`,organizationId: process.env.PLANETSCALE_ORG_ID!,database: database,branch: branch,role: "admin",});// Generate and run migrationsawait Exec("DrizzleGenerate", {command: "bun run db:generate",env: {DATABASE_NAME: database.name,DATABASE_HOST: password.host,DATABASE_USERNAME: password.username,DATABASE_PASSWORD: password.password,},});await Exec("DrizzleMigrate", {command:process.platform === "win32"? `cmd /C "bun run db:migrate || if %ERRORLEVEL%==9 exit 0 else exit %ERRORLEVEL%"`: `sh -c 'bun run db:migrate || ( [ $? -eq 9 ] && exit 0 ); exit $?'`,env: {DATABASE_NAME: database.name,DATABASE_HOST: password.host,DATABASE_USERNAME: password.username,DATABASE_PASSWORD: password.password,},});// Start Drizzle Studio in local developmentif (app.local) {Exec("DrizzleStudio", {command: "bun run db:studio",env: {DATABASE_NAME: database.name,DATABASE_HOST: password.host,DATABASE_USERNAME: password.username,DATABASE_PASSWORD: password.password,},});}console.log({database: database.name,branch: branch.name,host: password.host,});await app.finalize(); -
Deploy your stack
Run
alchemy.run.ts
to deploy:Terminal window bun alchemy deployTerminal window npx alchemy deployTerminal window pnpm alchemy deployTerminal window yarn alchemy deployIt should log your database connection details:
Terminal window {database: "sample-database",branch: "my-planetscale-app-dev-branch",host: "aws.connect.psdb.cloud"} -
(Optional) Tear down
Clean up all PlanetScale resources created by this stack:
Terminal window bun alchemy destroyTerminal window npx alchemy destroyTerminal window pnpm alchemy destroyTerminal window yarn alchemy destroy