Option
HeimHeim Skill Webentwicklung drizzle-orm

Typsicheres SQL-ORM für TypeScript ohne Laufzeit-Overhead

...Alle erweitern
70
Zeit aktualisiert 29. Juni 2026

Über drizzle-orm

Drizzle ORM ist eine moderne, auf TypeScript basierende ORM-Bibliothek (Object-Relational Mapping), die entwickelt wurde, um typsichere Interaktionen mit SQL-Datenbanken zu ermöglichen und dabei den Overhead zur Laufzeit auf Null zu halten. Es löst das häufige Problem von Laufzeitfehlern und Typkonflikten bei der Arbeit mit relationalen Datenbanken, indem es eine Typüberprüfung zur Kompilierungszeit und eine SQL-ähnliche Syntax bietet, die Entwickler direkt in TypeScript verwenden können. Dies macht Datenbankoperationen vorhersehbarer und verringert die Wahrscheinlichkeit von Fehlern in serverlosen oder Edge-Laufzeitumgebungen, in denen Effizienz und minimale Abhängigkeiten entscheidend sind.

Das ORM bietet mehrere wichtige Funktionen und Möglichkeiten. Es unterstützt mehrere Datenbanken, darunter PostgreSQL, MySQL und SQLite, sodass Entwickler den für ihr Projekt geeigneten Treiber auswählen können. Drizzle ORM bietet ein flexibles Schemadefinitionssystem mit einer Vielzahl von Spaltentypen, die direkt auf TypeScript-Typen abgebildet sind, was eine starke Typisierung für Abfragen, Einfügungen und Aktualisierungen ermöglicht. Es umfasst zudem Funktionen zur Definition von Beziehungen zwischen Tabellen, wie beispielsweise Eins-zu-Viele-Beziehungen, und unterstützt die Typinferenz sowohl für SELECT- als auch für INSERT-Operationen. Darüber hinaus kann das Drizzle Kit für Migrationen genutzt werden, was die Verwaltung von Änderungen am Datenbankschema im Laufe der Zeit vereinfacht. Sein Design ohne Abhängigkeiten gewährleistet eine ressourcenschonende Integration in Projekte und optimale Leistung in ressourcenbeschränkten Umgebungen.

Zu den Zielnutzern zählen TypeScript-Entwickler, die Anwendungen erstellen, die mit SQL-Datenbanken interagieren und eine starke Typsicherheit sowie vorhersehbares Verhalten erfordern. Drizzle ORM ist besonders nützlich für Entwickler von serverlosen Anwendungen, Edge-Funktionen oder Projekten, bei denen Leistung und minimaler Laufzeit-Overhead wichtig sind. Es eignet sich für Szenarien, die von einfachen CRUD-Anwendungen bis hin zu komplexeren Systemen mit relationalen Datenmodellen und fortgeschrittenen Abfragemustern reichen, und bietet einen zuverlässigen und wartbaren Ansatz für Datenbankinteraktionen unter Nutzung des Typsystems von TypeScript.

FAQ

Wie installiere und richte ich Drizzle ORM ein?

Sie können das ORM-Kernmodul über npm mit dem Befehl `npm install drizzle-orm` installieren und anschließend den passenden Datenbanktreiber für Ihre Datenbank installieren, beispielsweise `pg` für PostgreSQL oder `mysql2` für MySQL. Für Migrationen installieren Sie `drizzle-kit` als Entwicklungsabhängigkeit.

Welche Datenbanken sind mit Drizzle ORM kompatibel?

Drizzle ORM unterstützt PostgreSQL, MySQL und SQLite über die jeweiligen Datenbanktreiber.

Verursacht Drizzle ORM einen zusätzlichen Overhead zur Laufzeit?

Nein, Drizzle ORM ist so konzipiert, dass es keinen Laufzeit-Overhead verursacht, und stützt sich auf Typüberprüfungen zur Kompilierungszeit, um Sicherheit und Korrektheit zu gewährleisten.

Kann ich Beziehungen zwischen Tabellen definieren?

Ja, Drizzle ORM unterstützt die Definition von Beziehungen wie „Eins-zu-Viele“, sodass Sie relationale Daten sicher in TypeScript modellieren können.

Ist Drizzle ORM für serverlose oder Edge-Umgebungen geeignet?

Ja, dank seines Designs ohne Abhängigkeiten und der effizienten Abfrageverarbeitung ist es für die Leistung in serverlosen und Edge-Laufzeitumgebungen optimiert.

Auf GitHub ansehen

Drizzle ORM

Modern TypeScript-first ORM with zero dependencies, compile-time type safety, and SQL-like syntax. Optimized for edge runtimes and serverless environments.

Quick Start

Installation

# Core ORMnpm install drizzle-orm# Database driver (choose one)npm install pg            # PostgreSQLnpm install mysql2        # MySQLnpm install better-sqlite3 # SQLite# Drizzle Kit (migrations)npm install -D drizzle-kit

Basic Setup

// db/schema.tsimport { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';export const users = pgTable('users', {  id: serial('id').primaryKey(),  email: text('email').notNull().unique(),  name: text('name').notNull(),  createdAt: timestamp('created_at').defaultNow(),});// db/client.tsimport { drizzle } from 'drizzle-orm/node-postgres';import { Pool } from 'pg';import * as schema from './schema';const pool = new Pool({ connectionString: process.env.DATABASE_URL });export const db = drizzle(pool, { schema });

First Query

import { db } from './db/client';import { users } from './db/schema';import { eq } from 'drizzle-orm';// Insertconst newUser = await db.insert(users).values({  email: '[email protected]',  name: 'John Doe',}).returning();// Selectconst allUsers = await db.select().from(users);// Whereconst user = await db.select().from(users).where(eq(users.id, 1));// Updateawait db.update(users).set({ name: 'Jane Doe' }).where(eq(users.id, 1));// Deleteawait db.delete(users).where(eq(users.id, 1));

Schema Definition

Column Types Reference

PostgreSQLMySQLSQLiteTypeScript
serial()serial()integer()number
text()text()text()string
integer()int()integer()number
boolean()boolean()integer()boolean
timestamp()datetime()integer()Date
json()json()text()unknown
uuid()varchar(36)text()string

Common Schema Patterns

import { pgTable, serial, text, varchar, integer, boolean, timestamp, json, unique } from 'drizzle-orm/pg-core';export const users = pgTable('users', {  id: serial('id').primaryKey(),  email: varchar('email', { length: 255 }).notNull().unique(),  passwordHash: varchar('password_hash', { length: 255 }).notNull(),  role: text('role', { enum: ['admin', 'user', 'guest'] }).default('user'),  metadata: json('metadata').$type<{ theme: string; locale: string }>(),  isActive: boolean('is_active').default(true),  createdAt: timestamp('created_at').defaultNow().notNull(),  updatedAt: timestamp('updated_at').defaultNow().notNull(),}, (table) => ({  emailIdx: unique('email_unique_idx').on(table.email),}));// Infer TypeScript typestype User = typeof users.$inferSelect;type NewUser = typeof users.$inferInsert;

Relations

One-to-Many

import { pgTable, serial, text, integer } from 'drizzle-orm/pg-core';import { relations } from 'drizzle-orm';export const authors = pgTable('authors', {  id: serial('id').primaryKey(),  name: text('name').notNull(),});export const posts = pgTable('posts', {  id: serial('id').primaryKey(),  title: text('title').notNull(),  authorId: integer('author_id').notNull().references(() => authors.id),});export const authorsRelations = relations(authors, ({ many }) => ({  posts: many(posts),}));export const postsRelations = relations(posts, ({ one }) => ({  author: one(authors, {    fields: [posts.authorId],    references: [authors.id],  }),}));// Query with relationsconst authorsWithPosts = await db.query.authors.findMany({  with: { posts: true },});

Many-to-Many

export const users = pgTable('users', {  id: serial('id').primaryKey(),  name: text('name').notNull(),});export const groups = pgTable('groups', {  id: serial('id').primaryKey(),  name: text('name').notNull(),});export const usersToGroups = pgTable('users_to_groups', {  userId: integer('user_id').notNull().references(() => users.id),  groupId: integer('group_id').notNull().references(() => groups.id),}, (table) => ({  pk: primaryKey({ columns: [table.userId, table.groupId] }),}));export const usersRelations = relations(users, ({ many }) => ({  groups: many(usersToGroups),}));export const groupsRelations = relations(groups, ({ many }) => ({  users: many(usersToGroups),}));export const usersToGroupsRelations = relations(usersToGroups, ({ one }) => ({  user: one(users, { fields: [usersToGroups.userId], references: [users.id] }),  group: one(groups, { fields: [usersToGroups.groupId], references: [groups.id] }),}));

Queries

Filtering

import { eq, ne, gt, gte, lt, lte, like, ilike, inArray, isNull, isNotNull, and, or, between } from 'drizzle-orm';// Equalityawait db.select().from(users).where(eq(users.email, '[email protected]'));// Comparisonawait db.select().from(users).where(gt(users.id, 10));// Pattern matchingawait db.select().from(users).where(like(users.name, '%John%'));// Multiple conditionsawait db.select().from(users).where(  and(    eq(users.role, 'admin'),    gt(users.createdAt, new Date('2024-01-01'))  ));// IN clauseawait db.select().from(users).where(inArray(users.id, [1, 2, 3]));// NULL checksawait db.select().from(users).where(isNull(users.deletedAt));

Joins

import { eq } from 'drizzle-orm';// Inner joinconst result = await db  .select({    user: users,    post: posts,  })  .from(users)  .innerJoin(posts, eq(users.id, posts.authorId));// Left joinconst result = await db  .select({    user: users,    post: posts,  })  .from(users)  .leftJoin(posts, eq(users.id, posts.authorId));// Multiple joins with aggregationimport { count, sql } from 'drizzle-orm';const result = await db  .select({    authorName: authors.name,    postCount: count(posts.id),  })  .from(authors)  .leftJoin(posts, eq(authors.id, posts.authorId))  .groupBy(authors.id);

Pagination & Sorting

import { desc, asc } from 'drizzle-orm';// Order byawait db.select().from(users).orderBy(desc(users.createdAt));// Limit & offsetawait db.select().from(users).limit(10).offset(20);// Pagination helperfunction paginate(page: number, pageSize: number = 10) {  return db.select().from(users)    .limit(pageSize)    .offset(page * pageSize);}

Transactions

// Auto-rollback on errorawait db.transaction(async (tx) => {  await tx.insert(users).values({ email: '[email protected]', name: 'John' });  await tx.insert(posts).values({ title: 'First Post', authorId: 1 });  // If any query fails, entire transaction rolls back});// Manual controlconst tx = db.transaction(async (tx) => {  const user = await tx.insert(users).values({ ... }).returning();  if (!user) {    tx.rollback();    return;  }  await tx.insert(posts).values({ authorId: user.id });});

Migrations

Drizzle Kit Configuration

// drizzle.config.tsimport type { Config } from 'drizzle-kit';export default {  schema: './db/schema.ts',  out: './drizzle',  dialect: 'postgresql',  dbCredentials: {    url: process.env.DATABASE_URL!,  },} satisfies Config;

Migration Workflow

# Generate migrationnpx drizzle-kit generate# View SQLcat drizzle/0000_migration.sql# Apply migrationnpx drizzle-kit migrate# Introspect existing databasenpx drizzle-kit introspect# Drizzle Studio (database GUI)npx drizzle-kit studio

Example Migration

-- drizzle/0000_initial.sqlCREATE TABLE IF NOT EXISTS "users" (  "id" serial PRIMARY KEY NOT NULL,  "email" varchar(255) NOT NULL,  "name" text NOT NULL,  "created_at" timestamp DEFAULT now() NOT NULL,  CONSTRAINT "users_email_unique" UNIQUE("email"));

Navigation

Detailed References

  • 🏗️ Advanced Schemas - Custom types, composite keys, indexes, constraints, multi-tenant patterns. Load when designing complex database schemas.

  • 🔍 Query Patterns - Subqueries, CTEs, raw SQL, prepared statements, batch operations. Load when optimizing queries or handling complex filtering.

  • ⚡ Performance - Connection pooling, query optimization, N+1 prevention, prepared statements, edge runtime integration. Load when scaling or optimizing database performance.

  • 🔄 vs Prisma - Feature comparison, migration guide, when to choose Drizzle over Prisma. Load when evaluating ORMs or migrating from Prisma.

Red Flags

Stop and reconsider if:

  • Using any or unknown for JSON columns without type annotation
  • Building raw SQL strings without using sql template (SQL injection risk)
  • Not using transactions for multi-step data modifications
  • Fetching all rows without pagination in production queries
  • Missing indexes on foreign keys or frequently queried columns
  • Using select() without specifying columns for large tables

Performance Benefits vs Prisma

MetricDrizzlePrisma
Bundle Size~35KB~230KB
Cold Start~10ms~250ms
Query SpeedBaseline~2-3x slower
Memory~10MB~50MB
Type GenerationRuntime inferenceBuild-time generation

Integration

  • typescript-core: Type-safe schema inference with satisfies
  • nextjs-core: Server Actions, Route Handlers, Middleware integration
  • Database Migration: Safe schema evolution patterns

Related Skills

When using Drizzle, these skills enhance your workflow:

  • prisma: Alternative ORM comparison: Drizzle vs Prisma trade-offs
  • typescript: Advanced TypeScript patterns for type-safe queries
  • nextjs: Drizzle with Next.js Server Actions and API routes
  • sqlalchemy: SQLAlchemy patterns for Python developers learning Drizzle

[Full documentation available in these skills if deployed in your bundle]

drizzle-orm installieren

Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.

ZIP herunterladen

Klonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.

git clone https://github.com/bobmatnyc/claude-mpm-skills/blob/main/toolchains/typescript/data/drizzle/SKILL.md # Copy SKILL.md to your .claude/skills/ directory

Kopieren Kopieren
Schnelle Einrichtung: Kopiere den Skill-Ordner nach .claude/skills/. Claude erkennt den Skill automatisch und nutzt ihn.

Ähnliche Skills

github-code-search
Zeit aktualisiert 29. Juni 2026
clickhouse-io
Zeit aktualisiert 29. Juni 2026
prisma-client-api
Zeit aktualisiert 29. Juni 2026
coding-standards
Zeit aktualisiert 29. Juni 2026
OR