Claude-skills cloudflare-hyperdrive
Cloudflare Hyperdrive for Workers-to-database connections with pooling and caching. Use for PostgreSQL/MySQL, Drizzle/Prisma, or encountering pool errors, TLS issues, connection refused.
install
source · Clone the upstream repo
git clone https://github.com/secondsky/claude-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/secondsky/claude-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/cloudflare-hyperdrive/skills/cloudflare-hyperdrive" ~/.claude/skills/secondsky-claude-skills-cloudflare-hyperdrive && rm -rf "$T"
manifest:
plugins/cloudflare-hyperdrive/skills/cloudflare-hyperdrive/SKILL.mdsource content
Cloudflare Hyperdrive
Status: Production Ready ✅ | Last Verified: 2025-11-18
What Is Hyperdrive?
Connect Workers to existing PostgreSQL/MySQL databases:
- Global connection pooling
- Query caching
- Reduced latency
- Works with node-postgres, postgres.js, mysql2
Quick Start (5 Minutes)
1. Create Hyperdrive Config
bunx wrangler hyperdrive create my-db \ --connection-string="postgres://user:pass@host:5432/database"
Save the
id!
2. Configure Binding
{ "name": "my-worker", "main": "src/index.ts", "compatibility_date": "2024-09-23", "compatibility_flags": ["nodejs_compat"], // REQUIRED! "hyperdrive": [ { "binding": "HYPERDRIVE", "id": "<ID_FROM_STEP_1>" } ] }
3. Install Driver
bun add pg # or postgres, or mysql2
4. Query Database
import { Client } from 'pg'; export default { async fetch(request, env, ctx) { const client = new Client({ connectionString: env.HYPERDRIVE.connectionString }); await client.connect(); const result = await client.query('SELECT * FROM users LIMIT 10'); await client.end(); return Response.json(result.rows); } };
Load
for complete walkthrough.references/setup-guide.md
Critical Rules
Always Do ✅
- Enable nodejs_compat flag (required!)
- Use env.HYPERDRIVE.connectionString (not original DB string)
- Close connections after queries
- Handle errors explicitly
- Use connection pooling (built-in)
- Test locally with wrangler dev
- Monitor query performance
- Use prepared statements
- Enable query caching (automatic)
- Secure connection strings (use secrets)
Never Do ❌
- Never skip nodejs_compat (drivers won't work)
- Never use original DB connection string in Workers
- Never leave connections open (pool exhaustion)
- Never skip error handling (DB can fail)
- Never hardcode credentials in code
- Never exceed connection limits
- Never use eval/Function (blocked in Workers)
- Never skip TLS for production DBs
- Never use blocking queries (Worker timeout)
- Never expose DB errors to users
Database Drivers
PostgreSQL (node-postgres)
import { Client } from 'pg'; const client = new Client({ connectionString: env.HYPERDRIVE.connectionString }); await client.connect(); const result = await client.query('SELECT * FROM users'); await client.end();
PostgreSQL (postgres.js)
import postgres from 'postgres'; const sql = postgres(env.HYPERDRIVE.connectionString); const users = await sql`SELECT * FROM users`;
MySQL
import mysql from 'mysql2/promise'; const connection = await mysql.createConnection(env.HYPERDRIVE.connectionString); const [rows] = await connection.execute('SELECT * FROM users'); await connection.end();
With Drizzle ORM
import { drizzle } from 'drizzle-orm/node-postgres'; import { Client } from 'pg'; const client = new Client({ connectionString: env.HYPERDRIVE.connectionString }); await client.connect(); const db = drizzle(client); const users = await db.select().from(usersTable); await client.end();
Common Use Cases
Use Case 1: Read-Only Queries
export default { async fetch(request, env, ctx) { const client = new Client({ connectionString: env.HYPERDRIVE.connectionString }); await client.connect(); const users = await client.query('SELECT * FROM users WHERE active = true'); await client.end(); return Response.json(users.rows); } };
Use Case 2: Parameterized Queries
const userId = new URL(request.url).searchParams.get('id'); const client = new Client({ connectionString: env.HYPERDRIVE.connectionString }); await client.connect(); const result = await client.query( 'SELECT * FROM users WHERE id = $1', [userId] ); await client.end();
Use Case 3: Transactions
const client = new Client({ connectionString: env.HYPERDRIVE.connectionString }); await client.connect(); try { await client.query('BEGIN'); await client.query('UPDATE accounts SET balance = balance - 100 WHERE id = $1', [1]); await client.query('UPDATE accounts SET balance = balance + 100 WHERE id = $1', [2]); await client.query('COMMIT'); } catch (e) { await client.query('ROLLBACK'); throw e; } finally { await client.end(); }
Supported Databases
PostgreSQL:
- Amazon RDS
- Amazon Aurora
- Neon
- Supabase
- Railway
- Render
- DigitalOcean
- Any PostgreSQL 11+
MySQL:
- Amazon RDS
- Amazon Aurora
- PlanetScale
- Any MySQL 5.7+
Official Documentation
- Hyperdrive Overview: https://developers.cloudflare.com/hyperdrive/
- Get Started: https://developers.cloudflare.com/hyperdrive/get-started/
- Configuration: https://developers.cloudflare.com/hyperdrive/configuration/
Bundled Resources
References (
references/):
- Complete setup walkthrough (create config, bind, query)setup-guide.md
- Connection pool configuration and best practicesconnection-pooling.md
- Query caching strategies and optimizationquery-caching.md
- Drizzle ORM integration patternsdrizzle-integration.md
- Prisma ORM integration patternsprisma-integration.md
- Complete list of supported PostgreSQL and MySQL providerssupported-databases.md
- TLS/SSL configuration for secure connectionstls-ssl-setup.md
- Common issues and solutionstroubleshooting.md
- Complete wrangler CLI commands for Hyperdrivewrangler-commands.md
Templates (
templates/):
- Basic PostgreSQL with node-postgrespostgres-basic.ts
- PostgreSQL with postgres.js driverpostgres-js.ts
- PostgreSQL with connection poolingpostgres-pool.ts
- MySQL with mysql2 drivermysql2-basic.ts
- Drizzle ORM with PostgreSQLdrizzle-postgres.ts
- Drizzle ORM with MySQLdrizzle-mysql.ts
- Prisma ORM with PostgreSQLprisma-postgres.ts
- Local development setup scriptlocal-dev-setup.sh
- Wrangler configuration examplewrangler-hyperdrive-config.jsonc
Questions? Issues?
- Check
for complete setupreferences/setup-guide.md - Verify nodejs_compat flag enabled
- Ensure using env.HYPERDRIVE.connectionString
- Check connection properly closed