Prisma ist ein modernes TypeScript-ORM, das dir mit einem deklarativen Schema, automatischen Migrationen und einem vollstaendig typisierten Client das Leben mit Datenbanken drastisch vereinfacht. Einmal ausprobiert, willst du nie wieder zurueck.
Hey! Hast du auch schon mal mit rohen SQL-Queries kaempfen muessen und dir dabei gewuenscht, dass dein ORM einfach versteht, was du willst? Dann lass mich dir Prisma vorstellen - das ORM, das sich anfuehlt, als haette es jemand gebaut, der deine Schmerzen kennt. π
Was ist Prisma ueberhaupt? π€
Prisma ist ein Open-Source-ORM fuer Node.js und TypeScript, das einen komplett anderen Ansatz verfolgt als klassische ORMs. Statt Klassen und Decorators nutzt Prisma ein eigenes Schema-Format (schema.prisma), aus dem automatisch ein typsicherer Client generiert wird. Das Ergebnis: Du hast Autocomplete und Typechecking fuer jede einzelne Datenbankabfrage.
Prisma besteht aus drei Hauptkomponenten:
- Prisma Client - Der auto-generierte, typsichere Query-Builder
- Prisma Migrate - Das deklarative Migrationssystem
- Prisma Studio - Ein visueller Datenbank-Editor
Das Schema: Dein Single Source of Truth π
Alles beginnt mit der schema.prisma-Datei. Hier definierst du deine Datenbank-Verbindung und deine Models. Das Schoene: Es ist super lesbar und intuitiv.
// schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
profile Profile?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Profile {
id Int @id @default(autoincrement())
bio String?
userId Int @unique
user User @relation(fields: [userId], references: [id])
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id])
tags Tag[]
createdAt DateTime @default(now())
}
model Tag {
id Int @id @default(autoincrement())
name String @unique
posts Post[]
}Schon an diesem Beispiel siehst du: Relationen sind direkt im Schema sichtbar. Ein User hat viele Posts, ein Post gehoert zu einem User, und Tags haben eine Many-to-Many-Beziehung zu Posts. Alles klar und deklarativ.
Migrationen: Keine Angst vor Schema-Aenderungen π
Wenn du dein Schema aenderst, erstellt Prisma Migrate automatisch SQL-Migrationen fuer dich:
# Migration erstellen und ausfuehren
npx prisma migrate dev --name add-user-model
# Client neu generieren
npx prisma generatePrisma analysiert den Unterschied zwischen deinem aktuellen Schema und der Datenbank und erzeugt die passenden SQL-Statements. Du musst nie wieder manuell ALTER TABLE schreiben (es sei denn, du willst es).
Prisma Client: Typsichere Queries, die Spass machen π―
Jetzt kommt das Herzstuck. Nach dem Generieren hast du einen Client, der exakt dein Schema kennt. Hier ein paar Beispiele:
CRUD-Operationen
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
// Create - Neuen User anlegen
const user = await prisma.user.create({
data: {
email: '[email protected]',
name: 'Max Mustermann',
},
})
// Read - User finden
const allUsers = await prisma.user.findMany()
const singleUser = await prisma.user.findUnique({
where: { email: '[email protected]' },
})
// Update - User aktualisieren
const updatedUser = await prisma.user.update({
where: { id: 1 },
data: { name: 'Max M.' },
})
// Delete - User loeschen
const deletedUser = await prisma.user.delete({
where: { id: 1 },
})Das Geniale: Bei jedem dieser Aufrufe hast du volles Autocomplete. Tippst du prisma.user.create({ data: { , zeigt dir dein Editor genau die Felder an, die du setzen kannst - inklusive welche optional und welche Pflicht sind.
Relationen und Nested Writes β¨
Hier wird es richtig cool. Du kannst verschachtelte Daten in einer einzigen Operation erstellen:
// User MIT Post und Profil in einem Rutsch erstellen
const userWithRelations = await prisma.user.create({
data: {
email: '[email protected]',
name: 'Lisa',
profile: {
create: {
bio: 'Full-Stack Entwicklerin aus Berlin',
},
},
posts: {
create: [
{
title: 'Mein erster Post',
content: 'Hallo Welt!',
published: true,
},
{
title: 'Prisma ist super',
content: 'Ernsthaft, probier es aus.',
},
],
},
},
include: {
profile: true,
posts: true,
},
})Und beim Abfragen kannst du Relationen einfach mit include oder select laden:
// Alle User mit ihren Posts laden
const usersWithPosts = await prisma.user.findMany({
include: {
posts: {
where: { published: true },
orderBy: { createdAt: 'desc' },
},
profile: true,
},
})
// Nur bestimmte Felder selektieren
const userNames = await prisma.user.findMany({
select: {
name: true,
email: true,
_count: {
select: { posts: true },
},
},
})Raw Queries: Wenn es mal speziell wird π§
Manchmal brauchst du einfach rohes SQL. Kein Problem, Prisma hat dich abgedeckt:
// Typsichere Raw Queries
const result = await prisma.$queryRaw`
SELECT u.name, COUNT(p.id) as post_count
FROM "User" u
LEFT JOIN "Post" p ON p."authorId" = u.id
GROUP BY u.name
HAVING COUNT(p.id) > ${minPosts}
`
// Oder fuer Mutationen
await prisma.$executeRaw`
UPDATE "User"
SET name = ${newName}
WHERE id = ${userId}
`Tagged Template Literals schuetzen dich hier automatisch vor SQL-Injection. Sicherheit out of the box! π‘οΈ
Prisma Studio: Deine Daten im Blick π
Mit einem simplen Befehl startest du einen visuellen Editor fuer deine Datenbank:
npx prisma studioDas oeffnet eine Web-Oberflaeche, in der du deine Daten browsen, filtern, bearbeiten und sogar neue Eintraege erstellen kannst. Super praktisch fuer die Entwicklung und Debugging.
Prisma vs. TypeORM vs. Sequelize βοΈ
| Feature | Prisma | TypeORM | Sequelize |
|---|---|---|---|
| Schema-Definition | Eigenes Schema-Format | TypeScript-Decorators | JavaScript-Objekte |
| Type Safety | β Vollstaendig generiert | Gut, aber manuell | Eingeschraenkt |
| Migrationen | Automatisch aus Schema | Auto-generate moeglich | Manuell/CLI |
| Lernkurve | Flach | Mittel | Mittel |
| Raw SQL | Tagged Templates | Query Builder | Sequelize.literal |
| Visueller Editor | Prisma Studio | Nein | Nein |
| DB-Support | PostgreSQL, MySQL, SQLite, MongoDB, CockroachDB | Viele RDBMs | Viele RDBMs |
Prisma glaenzt besonders bei der Type Safety und der Developer Experience. Der generierte Client ist unschlagbar, wenn es um Autocomplete und Fehlererkennung zur Compile-Zeit geht.
TypeORM ist eine solide Wahl, wenn du aus der Java/C#-Welt kommst und das Active-Record- oder Data-Mapper-Pattern bevorzugst. Sequelize ist der Klassiker, hat aber in Sachen TypeScript-Support deutlich das Nachsehen.
Wann solltest du Prisma nutzen? π―
Prisma ist ideal, wenn du:
- Mit TypeScript arbeitest (der groesste Vorteil!)
- Wert auf Developer Experience legst
- Ein neues Projekt startest oder ein bestehendes migrieren willst
- PostgreSQL, MySQL, SQLite oder MongoDB nutzt
- In einem Team arbeitest, wo Schema-Aenderungen klar nachvollziehbar sein sollen
Weniger geeignet ist es, wenn du sehr komplexe SQL-Abfragen brauchst, die sich schwer in den Prisma-Client uebersetzen lassen - aber auch dafuer gibt es ja Raw Queries.
Fazit: Einfach ausprobieren! π
Prisma hat die Art, wie ich mit Datenbanken in TypeScript-Projekten arbeite, komplett veraendert. Die Kombination aus deklarativem Schema, automatischen Migrationen und dem genialen typisierten Client macht einfach Spass. Es fuehlt sich an, als wuerde die Datenbank endlich mit dir arbeiten statt gegen dich.
Probier es einfach mal aus - du wirst es nicht bereuen!
# Neues Projekt starten
npm init -y
npm install prisma @prisma/client
npx prisma init