02_Prisma
Lernmaterialien
Prisma
Prisma ist ein modernes ORM (Object-Relational Mapping) für TypeScript & JavaScript, das den Zugriff auf relationale Datenbanken stark vereinfacht und typsicher macht.
Kurzdefinition
Prisma ist:
ein Datenbank-Toolkit (nicht nur ein ORM)
entwickelt von der Prisma
TypeScript-first
stark typisiert
kompatibel mit PostgreSQL, MySQL, SQL Server, SQLite
➡️ Prisma übersetzt Typen & Objekte in SQL – sicher und kontrolliert.
Wozu braucht man Prisma?
Klassischer DB-Zugriff (Node.js):
const result = await db.query("SELECT * FROM users WHERE id = " + id);❌ SQL-Injection ❌ Keine Typprüfung ❌ Fehler erst zur Laufzeit
Mit Prisma:
const user = await prisma.user.findUnique({
where: { id: 1 }
});✅ Typsicher ✅ Autocomplete ✅ Sicher ✅ Lesbar
Die 3 Kernbestandteile von Prisma
1. Prisma Schema (Datenmodell)
model Student {
id Int @id @default(autoincrement())
name String
course String
}
➡️ Single Source of Truth
➡️ Vergleichbar mit:
ER-Modell
DDL in SQL
2. Prisma Client (Typsichere API)
Aus dem Schema wird automatisch Code generiert:
const users = await prisma.user.findMany();Methoden sind typisiert
Fehler schon im Editor
3. Migrationen
npx prisma migrate devVersionskontrolle für das DB-Schema
Reproduzierbare DB-Zustände
Vergleichbar mit Flyway / Liquibase
Unterstützte Datenbanken
| Datenbank | Support |
|---|---|
| PostgreSQL | ✅ |
| MySQL | ✅ |
| SQL Server | ✅ |
| SQLite | ✅ |
| Oracle | ❌ (Stand heute) |
➡️ Für Oracle wäre weiterhin:
JDBC / JPA
oder klassische SQL-Zugriffe nötig
Prisma vs. klassische ORMs
| Aspekt | Prisma | Hibernate / JPA |
|---|---|---|
| Sprache | TypeScript | Java |
| Typisierung | Sehr stark | Stark |
| Konfiguration | Einfach | Komplex |
| Performance | Sehr gut | Gut |
| SQL-Nähe | Mittel | Abstrakt |
➡️ Prisma ist weniger Magie, mehr Kontrolle.
Prisma & TypeScript (großer Vorteil)
Prisma nutzt TypeScript maximal aus:
Autocomplete
Compile-Fehler bei falschen Queries
Typisierte Relationen
user.posts[0].title // garantiert vorhanden➡️ Keine NullPointer-Überraschungen
Prisma & moderne Runtimes
Prisma funktioniert mit:
Node.js
Deno
Bun
Serverless & Cloud
Besonders beliebt in:
REST-APIs
GraphQL
Microservices
Typische Architektur mit Prisma
Controller / API
↓
Prisma Client
↓
SQL-Datenbank
➡️ Saubere Schichten
Implementierung
deno add npm:prisma@6
deno add npm:prisma/client@6
deno -A prisma init
generate the content for schema.prisma. I will use SQLite with a Student table. Check server.ts for structure. in the generator section use runtime deno and outpt directory generated.
change:
provider = "prisma-client"
url = env("DATABASE_URL")
schema.prisma
generator client {
provider = "prisma-client"
runtime = "deno"
output = "./generated"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Student {
id Int @id @default(autoincrement())
name String
course String
}
.env
DATABASE_URL=file:../student.db
.gitignore
.env
**/*.db
{
"tasks": {
"dev": "deno --watch -A --env-file server.ts",
"pv": "deno -A prisma validate",
"pg": "deno -A prisma generate",
"pmd": "deno -A prisma migrate dev",
"pms": "deno -A prisma migrate status",
"seed": "deno -A --env-file seed.ts"
},
"dev": "deno --watch -A --env-file server.ts"
denoStartet die Deno Runtime.
--watchDeno überwacht alle verwendeten Dateien. Bei jeder Änderung wird das Programm wird automatisch neu gestartet.
-AAllow All Permissions. –allow-read –allow-write –allow-net –allow-env –allow-run –allow-ffi. Nur für Development empfohlen!
--env-fileLädt Umgebungsvariablen aus der Datei.env.
server.tsEinstiegspunkt der Anwendung.
"pv": "deno -A prisma validate"
pvName des Tasks ist frei wählbar. Prisma Validate.
validateprüft die Dateiprisma/schema.prisma. Syntax des Schemas, Models & Relationen und Datasource-Konfiguration.
"pg": "deno -A prisma generate"
pgPrisma Generate. startet die Deno Runtime. führt die Prisma-CLI ausliest
prisma/schema.prismaerzeugt den Prisma Client und schreibt Code in./generated/.Wann muss man
prisma generateausführen?
Schema geändert
Neue Relation
Neue DB
"pmd": "deno -A prisma migrate dev"
Dieser Befehl:
liest
prisma/schema.prismavergleicht es mit dem aktuellen DB-Schema
erstellt neue Migrationen (SQL)
wendet sie direkt auf die Datenbank an
führt automatisch
prisma generateaus
"pms": "deno -A prisma migrate status"
Zeigt:
welche Migrationen lokal existieren
welche in der Datenbank angewendet wurden
ob Migrationen fehlen, ausstehen oder driften
"seed": "deno -A --env-file seed.ts"
Initialdaten anlegen
-ANotwendig, weil
seed.tsmeist:
auf die Datenbank zugreift
Umgebungsvariablen liest
evtl. Dateien lädt
please generate the seed.ts file.
import { PrismaClient } from "./prisma/generated/client.ts";
const prisma = new PrismaClient();
const students = [
{ id: -1, name: "Anna", course: "Computer Science" },
{ id: -2, name: "Susi", course: "Mathematics" },
{ id: -3, name: "Fritz", course: "English" },
{ id: -4, name: "Andrea", course: "Mathematics" },
{ id: -5, name: "Thomas", course: "German" },
{ id: -6, name: "Verena", course: "Mathematics" },
{ id: -7, name: "Marion", course: "Mathematics" },
{ id: -8, name: "Karl", course: "Computer Science" },
{ id: -9, name: "Hans", course: "Mathematics" },
{ id: -10, name: "Barbara", course: "Computer Science" }
];
async function main() {
await prisma.student.deleteMany();
await prisma.student.createMany({
data: students
});
}
await main()
Das ARRAY im server.ts gehört gelöscht, da es durch eine Tabelle ersetzt wird!
refactor: students is now a prisma model.
endpoints.rest
GET http://localhost:3000/students
###
GET http://localhost:3000/students/3
###
POST http://localhost:3000/students
Content-Type: application/json
{
"name": "Max",
"course": "Italien"
}
###
PATCH http://localhost:3000/students/1
Content-Type: application/json
{
"name": "Annalisa",
"course": "Informatik"
}
###
DELETE http://localhost:3000/students/2