Drizzle ORM: Typesicheres SQL für TypeScript ohne Overhead

Wer mit TypeScript Datenbanken abfragt, kennt das Dilemma: Entweder man schreibt rohes SQL und verzichtet auf Typsicherheit, oder man greift zu einem vollwertigen ORM wie Prisma und akzeptiert einen gewaltigen Abstraktionslayer, der die SQL-Realität verschleiert. Drizzle ORM geht einen anderen Weg – es kombiniert die Ausdrucksstärke von SQL mit der Typsicherheit von TypeScript, bleibt dabei aber so leichtgewichtig, dass es auch in Edge-Umgebungen problemlos funktioniert.

Was ist Drizzle ORM?

Drizzle ORM ist ein TypeScript-ORM, das 2022 veröffentlicht wurde und seitdem rasant an Popularität gewonnen hat. Im Gegensatz zu klassischen ORMs, die SQL hinter einer abstrakten API verstecken, orientiert sich Drizzle eng an der SQL-Syntax. Entwickler, die SQL kennen, können Drizzle sofort produktiv einsetzen – die Lernkurve ist deutlich flacher als bei Alternativen.

Das Kernprinzip lautet: SQL-first, TypeScript-native. Abfragen werden so formuliert, wie man SQL denkt, aber der TypeScript-Compiler prüft jeden Schritt. Fehlende Spalten, falsche Typen oder ungültige Joins werden zur Compile-Zeit erkannt, nicht erst zur Laufzeit in der Produktion.

Ein weiterer entscheidender Vorteil ist die Paketgröße. Drizzle bringt nur rund 31 kB mit – ein Bruchteil dessen, was Prisma benötigt. Das macht es zur ersten Wahl für Cloudflare Workers, Vercel Edge Functions oder andere Laufzeitumgebungen mit strikten Bundle-Limits.

SQL-ähnliche Syntax mit TypeScript-Inferenz

Die Syntax von Drizzle fühlt sich vertraut an, wenn man SQL kennt. Statt einer proprietären Abfragesprache verwendet Drizzle JavaScript-Methoden, die direkt auf SQL-Konzepte abgebildet werden:

import { db } from './db';
import { users } from './schema';
import { eq, gt } from 'drizzle-orm';

// SELECT * FROM users WHERE age > 18 AND email = '[email protected]'
const result = await db.select()
  .from(users)
  .where(gt(users.age, 18));

TypeScript leitet dabei den Rückgabetyp automatisch aus dem Schema ab. Wenn das Schema age als integer definiert, weiß der Compiler, dass result[0].age eine Zahl ist – kein manuelles Typing nötig.

Schema-Definition mit Drizzle

Schemata werden in TypeScript direkt im Code definiert. Drizzle unterstützt dabei alle gängigen Datenbanktypen und gibt Ihnen die volle Kontrolle über Constraints, Default-Werte und Indizes:

import { pgTable, serial, text, integer, timestamp } from 'drizzle-orm/pg-core';

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  email: text('email').unique().notNull(),
  age: integer('age'),
  createdAt: timestamp('created_at').defaultNow(),
});

Für MySQL und SQLite gibt es analoge Importpfade (drizzle-orm/mysql-core bzw. drizzle-orm/sqlite-core). Die Schema-Definitionen sind portabel und können mit geringem Aufwand zwischen Datenbanktypen angepasst werden.

Migrationen mit drizzle-kit

Zum Migrations-Tooling gehört drizzle-kit, ein CLI-Werkzeug, das Schemaänderungen erkennt und SQL-Migrationsdateien generiert. Der Workflow ist dabei bewusst transparent gehalten:

  1. Schema in TypeScript anpassen
  2. npx drizzle-kit generate aufrufen – SQL-Datei wird erstellt
  3. Migration mit npx drizzle-kit migrate einspielen

Im Gegensatz zu Prisma, das Migrationen automatisch auflöst und dabei manchmal unerwartete SQL generiert, zeigt Drizzle immer exakt das SQL, das ausgeführt wird. Das erhöht die Nachvollziehbarkeit und das Vertrauen in kritische Schema-Änderungen.

Tipp: Drizzle-kit bietet mit dem Befehl npx drizzle-kit studio eine browserbasierte GUI zum Erkunden und Bearbeiten der Datenbank. Ideal für lokale Entwicklung – ähnlich wie Prisma Studio, aber ohne den Prisma-Overhead.

Unterstützte Datenbanken

Drizzle unterstützt alle wichtigen relationalen Datenbanken: PostgreSQL (via pg, postgres.js oder @vercel/postgres), MySQL (via mysql2) und SQLite (via better-sqlite3, bun:sqlite oder @libsql/client für Turso). Auch Neon Serverless, PlanetScale und Cloudflare D1 werden offiziell unterstützt.

Die Kombination mit Turso und dem libSQL-Client ist besonders attraktiv: Drizzle übernimmt dabei die Typsicherheit, während Turso für schnelle globale Reads am Edge sorgt. Mehr dazu im Turso-Artikel.

Drizzle Studio

Drizzle Studio ist die visuelle Oberfläche für Drizzle-Datenbanken. Es läuft lokal im Browser und erlaubt das Durchsuchen von Tabellen, das Ausführen von Abfragen und das direkte Bearbeiten von Datensätzen. Seit der Integration in drizzle-kit 0.20 ist kein separates Setup mehr nötig.

Vergleich: Drizzle vs. Prisma vs. TypeORM vs. Kysely

Kriterium Drizzle ORM Prisma TypeORM Kysely
Bundle-Größe ~31 kB ~2,5 MB (Client + Engine) ~400 kB ~35 kB
SQL-Nähe Sehr hoch Niedrig (eigene Sprache) Mittel Sehr hoch
Typsicherheit Vollständig inferiert Vollständig (generiert) Teilweise Vollständig inferiert
Migrationen drizzle-kit (SQL sichtbar) prisma migrate (automatisch) Manuell oder auto Keine (nur Query Builder)
Edge-Tauglich Ja Eingeschränkt Nein Ja
Schema-Sprache TypeScript Prisma Schema (.prisma) TypeScript Decorators TypeScript
Studio/GUI Ja (Drizzle Studio) Ja (Prisma Studio) Nein Nein

Warum Entwickler von Prisma zu Drizzle wechseln

Prisma war jahrelang die erste Wahl für TypeScript-Projekte – und das aus gutem Grund. Die Entwicklererfahrung ist hervorragend, die Dokumentation vorbildlich. Doch mit zunehmender Verbreitung von Edge-Runtimes und Serverless-Architekturen zeigen sich strukturelle Schwächen.

Das größte Problem: Prisma lädt eine native Query Engine (~2 MB) nach, die in Cloudflare Workers oder Deno Deploy schlicht nicht funktioniert. Prisma hat mit dem Edge-Client nachgezogen, aber die Komplexität bleibt hoch. Drizzle hingegen läuft von Haus aus in jeder JavaScript-Umgebung.

Ein weiterer Grund für den Wechsel ist die Kontrolle über SQL. Mit Prisma schreibt man kein SQL – man beschreibt Abfragen in einer abstrakten API, und Prisma generiert SQL daraus. Das ist für einfache CRUD-Operationen angenehm, stößt aber bei komplexen Joins, CTEs oder datenbankspezifischen Features schnell an Grenzen. Drizzle erlaubt zudem sql\`...\` Template Literals für beliebiges SQL, ohne den Typsystem-Schutz aufzugeben.

Achtung: Drizzle ist kein vollständiges ORM im klassischen Sinne – es fehlen einige Features wie automatische Relationen-Auflösung, die Prisma bietet. Für sehr komplexe Datenmodelle mit vielen Nested-Includes sollte man abwägen, ob die schlanke Drizzle-API ausreicht.

Fazit

Drizzle ORM hat sich als ernstzunehmende Alternative zu Prisma etabliert – besonders für Projekte, die auf Edge-Runtimes oder schlanke Bundles angewiesen sind. Die SQL-nahe Syntax, vollständige TypeScript-Inferenz ohne Codegenerierung und das transparente Migrations-Tooling machen es zu einem äußerst soliden Werkzeug. Wer SQL versteht und in TypeScript denkt, wird sich in Drizzle sofort heimisch fühlen.

Häufige Fragen zu Drizzle ORM

Kann Drizzle ORM auch ohne TypeScript verwendet werden?
Technisch ja, aber der Hauptvorteil von Drizzle – die vollständige Typ-Inferenz – geht ohne TypeScript verloren. Die Bibliothek ist explizit auf TypeScript-Projekte ausgelegt und entfaltet dort ihren vollen Nutzen.
Wie verhält sich Drizzle in Cloudflare Workers?
Drizzle ist vollständig Edge-kompatibel und funktioniert problemlos in Cloudflare Workers, Vercel Edge Functions und Deno Deploy. Da es keine nativen Binaries benötigt, ist kein spezielles Setup nötig.
Unterstützt Drizzle ORM Transaktionen?
Ja, Drizzle unterstützt Transaktionen über db.transaction(async (tx) => { ... }). Innerhalb des Callbacks stehen alle gewohnten Query-Methoden zur Verfügung, gebunden an die laufende Transaktion.
Wie reif ist Drizzle ORM für Produktionseinsatz?
Drizzle wird in vielen Produktionsprojekten eingesetzt und gilt als stabil. Die API ist seit Version 0.28 weitgehend stabil, und das Team von drizzle.team arbeitet aktiv an Bugfixes und neuen Features. Ein Changelog-Tracking ist empfohlen.