hyperdrive
4
总安装量
3
周安装量
#51876
全站排名
安装命令
npx skills add https://github.com/null-shot/cloudflare-skills --skill hyperdrive
Agent 安装分布
opencode
3
claude-code
3
github-copilot
3
codex
3
gemini-cli
3
cursor
3
Skill 文档
Hyperdrive
Accelerate access to existing PostgreSQL and MySQL databases with connection pooling and caching.
FIRST: Create Hyperdrive Configuration
# Create a Hyperdrive configuration for your database
npx wrangler hyperdrive create <YOUR_CONFIG_NAME> --connection-string="postgres://user:password@HOSTNAME_OR_IP_ADDRESS:PORT/database_name"
# Copy the ID from the output for your wrangler.jsonc
Add the binding to wrangler.jsonc:
{
"hyperdrive": [
{
"binding": "HYPERDRIVE",
"id": "<YOUR_DATABASE_ID>"
}
]
}
When to Use
Use Hyperdrive when:
- Connecting to existing databases – PostgreSQL or MySQL hosted anywhere
- Reducing connection latency – Connection pooling eliminates per-request connection overhead
- Geographic distribution – Cache query results at the edge for read-heavy workloads
- Database migration – Connect Workers to traditional databases without rewriting apps
- Connection limits – Share connections across many Workers efficiently
Quick Reference
| Operation | API |
|---|---|
| Get connection string | env.HYPERDRIVE.connectionString |
| Connect with Postgres.js | postgres(env.HYPERDRIVE.connectionString) |
| Query with Postgres.js | await sql`SELECT * FROM users` |
| No cleanup needed | Hyperdrive handles connection poolingâdon’t call sql.end() |
| List configs | npx wrangler hyperdrive list |
| Get config details | npx wrangler hyperdrive get <ID> |
| Update config | npx wrangler hyperdrive update <ID> --origin-password=<NEW_PASSWORD> |
| Delete config | npx wrangler hyperdrive delete <ID> |
Connect with Postgres.js
Install dependencies first:
npm install postgres
Code:
import postgres from "postgres";
export interface Env {
// If you set another name in the Wrangler config file as the value for 'binding',
// replace "HYPERDRIVE" with the variable name you defined.
HYPERDRIVE: Hyperdrive;
}
export default {
async fetch(request, env, ctx): Promise<Response> {
// Create a database client that connects to your database via Hyperdrive.
//
// Hyperdrive generates a unique connection string you can pass to
// supported drivers, including node-postgres, Postgres.js, and the many
// ORMs and query builders that use these drivers.
const sql = postgres(env.HYPERDRIVE.connectionString);
try {
// Test query
const results = await sql`SELECT * FROM pg_tables`;
// Return result rows as JSON
return Response.json(results);
} catch (e) {
console.error(e);
return Response.json(
{ error: e instanceof Error ? e.message : e },
{ status: 500 },
);
}
},
} satisfies ExportedHandler<Env>;
Connection Management
Important: Do NOT call sql.end() or close connections manually.
- Hyperdrive manages connection pooling automatically
- Connections are reused across requests efficiently
- Closing connections can cause errors and reduce performance
- The connection pool persists between Worker invocations
// â DON'T DO THIS
const sql = postgres(env.HYPERDRIVE.connectionString);
await sql`SELECT * FROM users`;
await sql.end(); // DON'T close the connection
// â
DO THIS INSTEAD
const sql = postgres(env.HYPERDRIVE.connectionString);
await sql`SELECT * FROM users`;
// Let Hyperdrive manage the connection
Supported Drivers
| Driver | Package | Notes |
|---|---|---|
| Postgres.js | postgres |
Recommended – 3.4.5 or later |
| node-postgres | pg |
Widely used, works well |
| Drizzle ORM | drizzle-orm |
Use with postgres driver |
| Prisma | @prisma/client |
Add ?connection_limit=1 to connection string |
See references/drivers.md for detailed driver integration examples.
ORM Integration
Drizzle ORM
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
export default {
async fetch(request, env, ctx): Promise<Response> {
const client = postgres(env.HYPERDRIVE.connectionString);
const db = drizzle(client);
const results = await db.select().from(users);
return Response.json(results);
}
};
Prisma
Important: Add ?connection_limit=1 to prevent connection pool exhaustion:
import { PrismaClient } from '@prisma/client';
export default {
async fetch(request, env, ctx): Promise<Response> {
// Append connection_limit=1 for Prisma
const prisma = new PrismaClient({
datasourceUrl: env.HYPERDRIVE.connectionString + '?connection_limit=1'
});
const users = await prisma.user.findMany();
return Response.json(users);
}
};
MySQL Support
Hyperdrive also supports MySQL databases:
# Create MySQL Hyperdrive config
npx wrangler hyperdrive create my-mysql \
--connection-string="mysql://user:password@host:3306/database"
import { connect } from '@planetscale/database';
export default {
async fetch(request, env, ctx): Promise<Response> {
const conn = connect({ url: env.HYPERDRIVE.connectionString });
const results = await conn.execute('SELECT * FROM users');
return Response.json(results.rows);
}
};
Caching Configuration
Hyperdrive automatically caches query results. Configure caching behavior when creating the config:
# Default: cache enabled with 60s TTL
npx wrangler hyperdrive create my-db \
--connection-string="postgres://..." \
--caching-disabled=false \
--max-age=60
Caching behavior:
- Only read queries (SELECT) are cached
- Write queries (INSERT, UPDATE, DELETE) are never cached
- Cache is automatically invalidated when writes occur to the same table
Detailed References
- references/setup.md – Creating configs, connection strings, security
- references/drivers.md – Driver-specific patterns, ORMs, troubleshooting
- references/testing.md – Local PostgreSQL setup, Vitest integration, testing with real databases
Best Practices
- Use Postgres.js 3.4.5+ – Best compatibility and performance with Hyperdrive
- Never call sql.end() – Hyperdrive manages connection lifecycle
- One config per database – Reuse the same Hyperdrive binding across Workers
- Use Prisma carefully – Always add
?connection_limit=1to the connection string - Test locally with wrangler dev – Use
--remoteflag to connect through Hyperdrive - Store credentials securely – Never commit connection strings; use environment variables
- Monitor with observability – Enable in
wrangler.jsoncto track query performance - Connection string format – Use standard Postgres/MySQL connection string format
Troubleshooting
Connection errors:
- Verify your database allows connections from Cloudflare IPs
- Check firewall rules and security groups
- Test connection string format (must be valid Postgres/MySQL URL)
Prisma connection pool errors:
- Add
?connection_limit=1to the connection string - Ensure Prisma client is initialized once per request, not globally
“Too many connections” errors:
- Your origin database may have reached its connection limit
- Increase max connections on your database server
- Hyperdrive already pools connections efficiently
Local development:
# Use --remote to test with actual Hyperdrive
npx wrangler dev --remote
# Or use local connection string for development
# (add to .dev.vars)
HYPERDRIVE_CONNECTION_STRING=postgres://localhost:5432/mydb