Kysely mit Claude Code: Typsicheres SQL für TypeScript 2026
Schema-Definition, Queries, Joins, Transactions und Migrations — Claude Code als Kysely-Experte für typsicheres SQL ohne ORM-Overhead.
📅 5. Mai 2026⏱ 11 min Lesezeit🗄️ Datenbank & SQL
TypeScript-Entwickler stehen oft vor demselben Dilemma: ORMs wie Prisma bieten Komfort, schränken aber Flexibilität ein. Raw-SQL verliert die Typsicherheit. Kysely löst dieses Dilemma elegant — es ist ein vollständig typsicherer SQL Query Builder, der dir die volle SQL-Kontrolle belässt und gleichzeitig Autocomplete sowie Compile-Zeit-Fehler liefert.
Kombiniert mit Claude Code wird Kysely noch mächtiger: Der KI-Assistent kennt das gesamte Kysely-API, schlägt korrekte Typen vor, erkennt Fehler in Join-Ausdrücken und generiert vollständige Migrations-Skripte auf Knopfdruck. In diesem Artikel zeigen wir dir, wie du beide Werkzeuge optimal einsetzt.
Tipp: Kysely 0.27+ ist stabil und produktionsreif. PostgreSQL, MySQL und SQLite werden nativ unterstützt. Claude Code kennt alle Dialekte inklusive der neuesten Plugin-API.
Setup Setup und Schema-Definition
Kysely erfordert keine Code-Generierung und kein separates Schema-File. Das gesamte Datenbankschema wird direkt als TypeScript-Interface definiert — Claude Code kann aus einem bestehenden SQL-Dump oder einer Migrations-Datei automatisch das passende Interface erzeugen.
Installation
# Installation für PostgreSQL
npm install kysely pg
npm install -D @types/pg
# Alternativ für MySQL
npm install kysely mysql2
# Alternativ für SQLite
npm install kysely better-sqlite3
npm install -D @types/better-sqlite3
Database Interface definieren
Das Herzstück von Kysely ist das Database-Interface. Jede Tabelle wird als eigenes Interface beschrieben — mit exakten TypeScript-Typen für jede Spalte. Claude Code generiert dieses Interface aus deinem SQL-Schema automatisch.
Claude Code Prompt: "Erstelle ein Kysely Database Interface für meine PostgreSQL-Tabelle mit dieser CREATE TABLE Anweisung: [SQL einfügen]" — Claude generiert alle Spaltentypen korrekt inklusive Nullable-Handling und ColumnType-Wrapper.
Kysely's Builder-API spiegelt SQL fast 1:1 wider — wer SQL kann, lernt Kysely in Minuten. Claude Code kennt alle Builder-Methoden und warnt, wenn du eine Spalte verwendest, die im Schema nicht existiert.
SELECT mit where, orderBy und limit
// src/db/queries/users.tsimport { db } from'../index'importtype { User } from'../types'// Einen User per ID ladenexport async functiongetUserById(id: number): Promise<User | undefined> {
returndb
.selectFrom('users')
.selectAll()
.where('id', '=', id)
.executeTakeFirst()
}
// Aktive User mit Paginationexport async functiongetActiveUsers(
page: number = 1,
pageSize: number = 20
): Promise<User[]> {
returndb
.selectFrom('users')
.selectAll()
.where('isActive', '=', true)
.orderBy('createdAt', 'desc')
.limit(pageSize)
.offset((page - 1) * pageSize)
.execute()
}
// Spezifische Spalten selektierenexport async functiongetUserEmails() {
returndb
.selectFrom('users')
.select(['id', 'email', 'name'])
.where('role', '=', 'admin')
.execute()
// Rückgabetyp: { id: number; email: string; name: string }[]
}
Achtung: Nutze sql.lit() oder Kysely-Parameter für alle User-Inputs — niemals String-Interpolation direkt in sql``. Claude Code erkennt potenzielle SQL-Injection-Stellen und warnt automatisch.
Join Joins und Relations
Joins in Kysely sind vollständig typsicher — TypeScript weiß nach einem innerJoin exakt, welche Spalten aus welcher Tabelle verfügbar sind. Claude Code hilft, komplexe Multi-Table-Joins korrekt zu konstruieren und Namenskonflikte zu lösen.
Alias-Tabellen für Self-Joins und komplexe Queries
import { db } from'../index'// aliasTable: für Self-Joins oder mehrfach gejoinede Tabellenexport async functiongetPostsWithDetails(userId: number) {
constauthor = db.dynamic.ref('author')
returndb
.selectFrom('posts')
.innerJoin(
'users as author',
'author.id', 'posts.userId'
)
.leftJoin('comments', 'comments.postId', 'posts.id')
.leftJoin(
'users as commenter',
'commenter.id', 'comments.userId'
)
.select([
'posts.id as postId',
'posts.title',
'author.name as authorName',
'comments.body as commentBody',
'commenter.name as commenterName',
])
.where('posts.userId', '=', userId)
.execute()
}
// Subquery als Joinexport async functiongetTopPostsByUser() {
constsubquery = db
.selectFrom('posts')
.select(eb => [
'userId',
eb.fn.max('viewCount').as('maxViews')
])
.groupBy('userId')
.as('topPosts')
returndb
.selectFrom(['users', subquery])
.select(['users.name', 'topPosts.maxViews'])
.whereRef('users.id', '=', 'topPosts.userId')
.execute()
}
Claude Code Vorteil: Bei komplexen Joins mit mehreren Tabellen-Aliases kann Claude Code den gesamten Typen-Stack ableiten und zeigt dir, welche Spalten nach dem Join verfügbar sind — ohne dass du die Kysely-Dokumentation nachschlagen musst.
Transaction Transactions
Kysely unterstützt Transactions nativ über db.transaction(). Alle Operationen innerhalb eines Callbacks laufen in einer gemeinsamen Transaktion — bei einem Fehler wird automatisch ein Rollback durchgeführt.
Einfache Transaction
import { db } from'../index'importtype { NewPost, NewUser } from'../types'// User + ersten Post in einer Transaktion erstellenexport async functioncreateUserWithPost(
userData: NewUser,
postData: Omit<NewPost, 'userId'>
) {
returndb.transaction().execute(async (trx) => {
// Schritt 1: User anlegenconstuser = awaittrx
.insertInto('users')
.values(userData)
.returningAll()
.executeTakeFirstOrThrow()
// Schritt 2: Post mit User-ID anlegenconstpost = awaittrx
.insertInto('posts')
.values({ ...postData, userId: user.id })
.returningAll()
.executeTakeFirstOrThrow()
// Fehler hier → automatischer Rollback für BEIDE Insertsreturn { user, post }
})
}
// Serializable Isolation für kritische Transaktionenawaitdb
.transaction()
.setIsolationLevel('serializable')
.execute(async (trx) => {
// Alle Reads/Writes sind serialisierbar
})
Wichtig: Übergib die trx-Instanz an alle Hilfsfunktionen, die in derselben Transaktion laufen sollen — nicht die globale db-Instanz. Claude Code erkennt diesen Fehler und zeigt einen Typ-Fehler, wenn du versehentlich db statt trx verwendest.
Migration Migrations
Kysely bringt ein einfaches Migrations-System mit: Migrator und FileMigrationProvider. Jede Migration ist eine TypeScript-Datei mit up und down-Funktion. Claude Code kann komplette Migrations-Dateien aus Tabellenbeschreibungen generieren.
Naming Convention: Migrations-Dateien müssen alphabetisch sortierbar sein — verwende ISO-Datum-Prefix (2026_05_01_). Kysely führt Migrations in dieser Reihenfolge aus. Claude Code generiert den korrekten Dateinamen automatisch.
Vergleich Kysely vs Prisma vs Drizzle
Die Wahl des richtigen SQL-Tools hängt vom Projekt ab. Hier ein ehrlicher Vergleich der drei populärsten TypeScript-Optionen — mit Blick auf Claude Code-Kompatibilität und produktive KI-unterstützte Entwicklung.
Kriterium
Kysely
Prisma
Drizzle
Typsicherheit
● Vollständig (Interface-basiert)
● Vollständig (Generated)
● Vollständig (Schema-First)
SQL-Kontrolle
● Vollständig (1:1 SQL)
● Eingeschränkt (Abstrahiert)
● Sehr hoch
Code-Generierung nötig
● Nein
● Ja (prisma generate)
● Optional (Introspection)
Bundle-Größe
● Sehr klein (~50kB)
● Groß (Engines ~50MB)
● Klein (~30kB)
Edge Runtime Support
● Ja
● Eingeschränkt
● Ja (Cloudflare D1 etc.)
Migrations-System
● Eingebaut (einfach)
● Vollständig
● Vollständig (Kit)
Raw SQL einfügbar
●sql`` Template Tag
●$queryRaw
●sql`` Template Tag
Lernkurve
● Flach (SQL-Kenntnisse reichen)
● Mittel (eigene Konzepte)
● Mittel (Schema-DSL)
Claude Code DX
● Exzellent (kein Codegen nötig)
● Gut (nach generate)
● Sehr gut
Relations/Eager Loading
● Manuell via Join
● Automatisch (include)
● Manuell oder relational queries
PostgreSQL Dialekt
● Voll unterstützt
● Voll unterstützt
● Voll unterstützt
Performance (Overhead)
● Minimal
● Moderate (Binary Engine)
● Minimal
Wann welches Tool?
Kysely: Du willst maximale SQL-Kontrolle, keine Code-Generierung, Edge-Deployments (Cloudflare Workers, Vercel Edge) oder eine schlanke Lösung ohne ORM-Magic.
Prisma: Du willst schnellen Start, automatische Relationen, ein reiches Ecosystem und Migrations als vollständiges Framework — und nimmst den größeren Bundle-Footprint in Kauf.
Drizzle: Du schätzt Kysely-ähnliche SQL-Kontrolle, willst aber ein stärkeres Migrations-System und eine schema-first Entwicklung direkt in TypeScript.
Claude Code Empfehlung: Für Projekte mit komplexen SQL-Anforderungen, bestehenden Datenbanken oder Edge-Deployments ist Kysely der beste Startpunkt — Claude Code kennt das gesamte API und kann ohne Code-Generierungsschritt direkt typsichere Queries schreiben. Für Greenfield-Projekte mit einfachen Relations ist Prisma oft schneller zu starten.
Migration von Prisma zu Kysely
Claude Code kann Prisma-Schemas direkt in Kysely-Interfaces konvertieren. Der Workflow: Prisma-Schema zeigen → Claude generiert das Database-Interface und alle Query-Äquivalente. Migrationszeit für mittlere Projekte: typischerweise 2–4 Stunden.
// Prisma Schema → Claude Code Prompt// "Konvertiere dieses Prisma-Schema in ein Kysely Database Interface// und schreibe die äquivalenten findMany/findUnique Queries in Kysely:"// Prisma: prisma.user.findMany({ where: { isActive: true } })// Kysely: db.selectFrom('users').selectAll().where('isActive', '=', true).execute()// Prisma: prisma.post.findUnique({ where: { id }, include: { author: true } })// Kysely: db.selectFrom('posts')// .innerJoin('users', 'users.id', 'posts.userId')// .select(['posts.id', 'posts.title', 'users.name as authorName'])// .where('posts.id', '=', id)// .executeTakeFirst()
Fazit: Kysely + Claude Code = typsicheres SQL ohne Kompromisse
Kysely ist kein ORM — und das ist seine größte Stärke. Du schreibst echtes SQL in TypeScript, bekommst volle Autocomplete-Unterstützung und Compile-Zeit-Fehler, ohne auf Code-Generierung oder Schema-Dateien angewiesen zu sein.
Claude Code macht Kysely noch produktiver: Der Assistent kennt die gesamte API, erkennt Type-Fehler in komplexen Joins, generiert Migrations-Dateien aus SQL-Dumps und erklärt, wann executeTakeFirst vs. executeTakeFirstOrThrow die richtige Wahl ist.
Ob du PostgreSQL, MySQL oder SQLite nutzt — Kysely passt sich dem Dialekt an, während dein TypeScript-Code identisch bleibt. Für Teams, die SQL beherrschen und typsichere Queries ohne ORM-Overhead wollen, ist Kysely 2026 die erste Wahl.
Nächste Schritte: Starte mit npm install kysely pg, definiere dein Database-Interface, und lass Claude Code die ersten Queries für dein bestehendes Schema generieren. In unter 30 Minuten hast du typsichere SQL-Abfragen in Production-Qualität.
Claude Code für dein TypeScript-Projekt nutzen
Typsichere Queries, automatische Migrations, komplexe Joins — Claude Code kennt Kysely in- und auswendig und beschleunigt deine Datenbankentwicklung erheblich.