Use Drizzle ORM with serverless database platforms for scalable, edge-ready applications
Drizzle ORM provides first-class support for serverless database platforms, offering optimized drivers and connection pooling designed for serverless environments where traditional database connections don’t work well.
The HTTP driver works everywhere, including edge runtimes, with no WebSocket requirements.
import { drizzle } from 'drizzle-orm/neon-http';import { neon } from '@neondatabase/serverless';// Direct connection stringconst sql = neon(process.env.DATABASE_URL!);const db = drizzle(sql);// Or with config objectconst db = drizzle({ connection: process.env.DATABASE_URL!,});// Query your databaseconst users = await db.select().from(usersTable);
The HTTP driver is perfect for Cloudflare Workers, Vercel Edge Functions, and other environments where WebSockets aren’t available.
For Node.js and environments with WebSocket support, use the WebSocket driver for lower latency.
import { drizzle } from 'drizzle-orm/neon-serverless';import { Pool } from '@neondatabase/serverless';// Create connection poolconst pool = new Pool({ connectionString: process.env.DATABASE_URL! });const db = drizzle(pool);// Use prepared statements for better performanceconst preparedQuery = db.select().from(usersTable).prepare();const users = await preparedQuery.execute();
import { drizzle } from 'drizzle-orm/planetscale-serverless';import { Client } from '@planetscale/database';// Using connection stringconst db = drizzle({ connection: process.env.DATABASE_URL!,});// Or create client manually for more controlconst client = new Client({ host: process.env.DATABASE_HOST!, username: process.env.DATABASE_USERNAME!, password: process.env.DATABASE_PASSWORD!,});const db = drizzle(client);
PlanetScale doesn’t support foreign key constraints at the database level. Use Drizzle’s relational queries for referential integrity in your application.
import { drizzle } from 'drizzle-orm/vercel-postgres';import { sql } from '@vercel/postgres';// Uses environment variables automatically in Vercelconst db = drizzle();// Or pass client explicitlyconst db = drizzle(sql);
Vercel automatically injects POSTGRES_URL and other connection variables when you create a Vercel Postgres database.
import { Pool } from '@neondatabase/serverless';import { drizzle } from 'drizzle-orm/neon-serverless';const pool = new Pool({ connectionString: process.env.DATABASE_URL!, max: 10, // Maximum connections in pool});const db = drizzle(pool);
PlanetScale uses a branch-based workflow instead of traditional migrations. Use Drizzle Kit to push schema changes to branches.
# Push schema to development branchdrizzle-kit push --config=drizzle.config.ts# Create deploy request in PlanetScale dashboard# Merge to production when ready