02_Prisma

Keine Dateien in diesem Thema verfügbar.

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.

001.png

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 dev
  • Versionskontrolle 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
002.png
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.
003.png

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
}
004.png

.env

DATABASE_URL=file:../student.db
005.png

.gitignore

.env
**/*.db
006.png
{
  "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"

deno Startet die Deno Runtime.

--watch Deno überwacht alle verwendeten Dateien. Bei jeder Änderung wird das Programm wird automatisch neu gestartet.

-A Allow All Permissions. –allow-read –allow-write –allow-net –allow-env –allow-run –allow-ffi. Nur für Development empfohlen!

--env-file Lädt Umgebungsvariablen aus der Datei .env.

server.ts Einstiegspunkt der Anwendung.

"pv": "deno -A prisma validate"

pv Name des Tasks ist frei wählbar. Prisma Validate.

validate prüft die Datei prisma/schema.prisma. Syntax des Schemas, Models & Relationen und Datasource-Konfiguration.

"pg": "deno -A prisma generate"

pg Prisma Generate. startet die Deno Runtime. führt die Prisma-CLI aus

liest prisma/schema.prisma erzeugt den Prisma Client und schreibt Code in ./generated/.

Wann muss man prisma generate ausführen?

  • Schema geändert

  • Neue Relation

  • Neue DB

"pmd": "deno -A prisma migrate dev"

Dieser Befehl:

  1. liest prisma/schema.prisma

  2. vergleicht es mit dem aktuellen DB-Schema

  3. erstellt neue Migrationen (SQL)

  4. wendet sie direkt auf die Datenbank an

  5. führt automatisch prisma generate aus

"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

-A

Notwendig, weil seed.ts meist:

  • auf die Datenbank zugreift

  • Umgebungsvariablen liest

  • evtl. Dateien lädt

008.png
007.png
009.png
010.png
011.png
012.png
013.png
014.png
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()
015.png

Das ARRAY im server.ts gehört gelöscht, da es durch eine Tabelle ersetzt wird!

refactor: students is now a prisma model.
016.png
017.png
018.png

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
019.png
020.png
021.png