Drizzle ORM
Drizzle ORM ↗ is a lightweight TypeScript ORM with a focus on type safety. This example demonstrates how to use Drizzle ORM with MySQL via Cloudflare Hyperdrive in a Workers application.
- A Cloudflare account with Workers access
- A MySQL database
- A Hyperdrive configuration to your MySQL database
Install the Drizzle ORM and its dependencies such as the mysql2 ↗ driver:
# mysql2 v3.13.0 or later is requirednpm i drizzle-orm mysql2 dotenvnpm i -D drizzle-kit tsx @types/nodeAdd the required Node.js compatibility flags and Hyperdrive binding to your wrangler.jsonc file:
{  "compatibility_flags": [    "nodejs_compat"  ],  "compatibility_date": "2024-09-23",  "hyperdrive": [    {      "binding": "HYPERDRIVE",      "id": "<your-hyperdrive-id-here>"    }  ]}# required for database drivers to functioncompatibility_flags = ["nodejs_compat"]compatibility_date = "2024-09-23"
[[hyperdrive]]binding = "HYPERDRIVE"id = "<your-hyperdrive-id-here>"With Drizzle ORM, we define the schema in TypeScript rather than writing raw SQL.
- 
Create a folder /db/in/src/.
- 
Create a schema.tsfile.
- 
In schema.ts, define auserstable as shown below.src/db/schema.ts // src/schema.tsimport { mysqlTable, int, varchar, timestamp } from "drizzle-orm/mysql-core";export const users = mysqlTable("users", {id: int("id").primaryKey().autoincrement(),name: varchar("name", { length: 255 }).notNull(),email: varchar("email", { length: 255 }).notNull().unique(),createdAt: timestamp("created_at").defaultNow(),});
Use your the credentials of your Hyperdrive configuration for your database when using the Drizzle ORM.
Populate your index.ts file as shown below.
// src/index.ts
import { drizzle } from "drizzle-orm/mysql2";import { createConnection } from "mysql2";import { users } from "./db/schema";
export interface Env {  HYPERDRIVE: Hyperdrive;  }
export default {  async fetch(request, env, ctx): Promise<Response> {    // Create a connection using the mysql2 driver with the Hyperdrive credentials (only accessible from your Worker).    const connection = await createConnection({      host: env.HYPERDRIVE.host,      user: env.HYPERDRIVE.user,      password: env.HYPERDRIVE.password,      database: env.HYPERDRIVE.database,      port: env.HYPERDRIVE.port,
      // Required to enable mysql2 compatibility for Workers      disableEval: true,    });
    // Create the Drizzle client with the mysql2 driver connection    const db = drizzle(connection);
    // Sample query to get all users    const allUsers = await db.select().from(users);
    return Response.json(allUsers);  },} satisfies ExportedHandler<Env>;You can generate and run SQL migrations on your database based on your schema using Drizzle Kit CLI. Refer to Drizzle ORM docs ↗ for additional guidance.
- 
Create a .envfile in the root folder of your project, and add your database connection string. The Drizzle Kit CLI will use this connection string to create and apply the migrations..env # .env# Replace with your direct database connection stringDATABASE_URL='mysql://user:password@db-host.cloud/database-name'
- 
Create a drizzle.config.tsfile in the root folder of your project to configure Drizzle Kit and add the following content:drizzle.config.ts import 'dotenv/config';import { defineConfig } from 'drizzle-kit';export default defineConfig({out: './drizzle',schema: './src/db/schema.ts',dialect: 'mysql',dbCredentials: {url: process.env.DATABASE_URL!,},});
- 
Generate the migration file for your database according to your schema files and apply the migrations to your database. Terminal window npx drizzle-kit generateNo config path provided, using default 'drizzle.config.ts'Reading config file 'drizzle.config.ts'Reading schema files:/src/db/schema.ts1 tablesusers 4 columns 0 indexes 0 fks[✓] Your SQL migration file ➜ drizzle/0000_daffy_rhodey.sql 🚀Terminal window npx drizzle-kit migrateNo config path provided, using default 'drizzle.config.ts'Reading config file 'drizzle.config.ts'
Deploy your Worker.
npx wrangler deploy- Learn more about How Hyperdrive Works.
- Refer to the troubleshooting guide to debug common issues.
- Understand more about other storage options available to Cloudflare Workers.
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Directory
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- © 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark