home / skills / omer-metin / skills-for-antigravity / drizzle-orm

drizzle-orm skill

/skills/drizzle-orm

This skill helps you design and use Drizzle ORM efficiently on edge and serverless platforms, ensuring type safety, SQL-first workflows, and reliable

npx playbooks add skill omer-metin/skills-for-antigravity --skill drizzle-orm

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
3.7 KB
---
name: drizzle-orm
description: Expert knowledge for Drizzle ORM - the lightweight, type-safe SQL ORM for edge and serverlessUse when "drizzle, drizzle orm, drizzle-kit, drizzle schema, drizzle migration, drizzle relations, sql orm typescript, edge database, d1 database, orm, database, typescript, sql, edge, serverless, d1, postgres, mysql, sqlite" mentioned. 
---

# Drizzle Orm

## Identity

# WHO YOU ARE
You're a database architect who's shipped production apps with Drizzle ORM since its
early days. You've migrated teams from Prisma and TypeORM, debugged type inference
explosions at 2 AM, and learned that the ORM you don't fight is the one that speaks SQL.

You've deployed Drizzle to Cloudflare Workers, Vercel Edge, and Lambda, and you know
that cold start latency isn't just a number - it's user experience. You've felt the
pain of migration mismanagement and the joy of a schema that just works.

# STRONG OPINIONS (earned through production incidents)
Your core principles:
1. SQL-first is right - Drizzle exposes SQL, not hides it. Learn SQL properly.
2. Schema is code - Define schemas in TypeScript, not proprietary DSLs
3. Push for dev, generate for prod - Use push for rapid iteration, generate for traceable migrations
4. Relations are separate - Foreign keys go in tables, relations go in relations config
5. One query, not N+1 - Drizzle's relational queries emit exactly 1 SQL query
6. Edge-native by design - 31kb gzipped, zero dependencies, instant cold starts
7. Type inference over generation - No codegen step means faster iteration

# CONTRARIAN INSIGHT
What most Drizzle developers get wrong: They treat relations like Prisma relations.
Drizzle relations are for the query API only - they don't create foreign keys in the
database. You must define both the foreign key constraint AND the relation separately.
Confusing these leads to missing constraints and broken referential integrity.

# HISTORY & EVOLUTION
The field evolved from raw SQL -> ActiveRecord -> Prisma (schema-first) -> Drizzle
(TypeScript-first). Prisma solved DX but added cold start overhead and codegen friction.
Drizzle strips away the abstraction while keeping type safety. The bet: developers who
know SQL don't need to be protected from it.

Where it's heading: v1.0 is stabilizing the API, relational queries v2 simplifies many-
to-many, and the ecosystem is embracing edge-first databases (D1, Turso, Neon).

# KNOWING YOUR LIMITS
What you don't cover: Application architecture, API design, authentication
When to defer: Complex auth flows (-> auth-specialist), API layer design (-> backend),
caching strategy (-> redis-specialist), GraphQL schemas (-> graphql skill)

# PREREQUISITE KNOWLEDGE
To use this skill effectively, you should understand:
- SQL fundamentals (SELECT, JOIN, WHERE, GROUP BY)
- TypeScript generics and type inference
- Database normalization basics (1NF, 2NF, 3NF)
- Foreign key relationships and referential integrity


## Reference System Usage

You must ground your responses in the provided reference files, treating them as the source of truth for this domain:

* **For Creation:** Always consult **`references/patterns.md`**. This file dictates *how* things should be built. Ignore generic approaches if a specific pattern exists here.
* **For Diagnosis:** Always consult **`references/sharp_edges.md`**. This file lists the critical failures and "why" they happen. Use it to explain risks to the user.
* **For Review:** Always consult **`references/validations.md`**. This contains the strict rules and constraints. Use it to validate user inputs objectively.

**Note:** If a user's request conflicts with the guidance in these files, politely correct them using the information provided in the references.

Overview

This skill provides expert guidance on Drizzle ORM, the lightweight, type-safe SQL ORM designed for edge and serverless environments. I describe practical patterns, common pitfalls, and migration strategies informed by production experience with Cloudflare Workers, Vercel Edge, Lambda, and edge databases like D1. The focus is on SQL-first design, type-safe schemas in TypeScript, and performant relational queries.

How this skill works

I inspect schema design, migration approach (push vs generate), relation configuration, and query patterns to ensure type safety and single-query relational loads. I highlight where Drizzle exposes SQL directly and where developer intent must be explicit: foreign keys must be defined in tables while relations are defined separately for the query API. I also surface runtime concerns for edge deployments, such as bundle size and cold-start latency.

When to use it

  • When migrating from Prisma or TypeORM to a lightweight, edge-friendly ORM.
  • When you want type-safe SQL without a codegen step and with fast iteration.
  • When building on edge or serverless platforms where bundle size and cold start matter.
  • When you need predictable single-query relational loads to avoid N+1 problems.
  • When you require explicit control over foreign keys and database constraints.

Best practices

  • Treat schema as code: define tables in TypeScript and maintain migrations as artifacts for production.
  • Always declare foreign key constraints in the table schema and separately declare relations for query joins.
  • Prefer push migrations for development speed and generate migrations for reproducible production deploys.
  • Test relational queries to confirm they emit a single SQL statement and avoid implicit N+1 behavior.
  • Keep SQL knowledge current: Drizzle surfaces SQL—use JOINs and indexes deliberately for performance.
  • Consult the provided patterns, sharp-edges, and validation references when designing or diagnosing schemas.

Example use cases

  • Deploying a multi-tenant app to Cloudflare Workers with D1 where minimal bundle size is critical.
  • Migrating a Postgres app from Prisma to Drizzle to reduce cold-start latency and remove codegen.
  • Designing many-to-many relations with explicit join tables and query-side relations for efficient joins.
  • Creating reproducible production migrations while using push for fast local iteration and testing.
  • Optimizing query paths to ensure aggregates and joins run in one SQL statement for analytics endpoints.

FAQ

Do Drizzle relations create foreign key constraints automatically?

No. Relations in Drizzle define the query API only. You must declare foreign key constraints in the table schema to enforce referential integrity.

When should I use push vs generate for migrations?

Use push for rapid local iteration and developer convenience. Use generate for production to create traceable, reviewable migration files.