Was ist ein ORM? So sprechen Apps mit Datenbanken
Ein ORM (Object-Relational Mapper) ist eine Code-Bibliothek, die zwischen einer App und einer relationalen Datenbank sitzt. Statt Datenbankabfragen in SQL zu schreiben, arbeiten Entwickler mit Daten als gewöhnlichen Objekten ihrer Programmiersprache – zum Beispiel db.booking.create(...) oder Booking.find(...). Das ORM übersetzt das in SQL, führt es aus und wandelt die Ergebnisse wieder in Objekte um. Bekannte Beispiele sind Prisma und Drizzle für TypeScript, SQLAlchemy für Python und Entity Framework Core für C#.
Warum ORMs wichtig sind, wenn Sie mit KI bauen
Wenn ein KI-App-Builder Ihrer App eine Datenbank hinzufügt, ergänzt er meist auch ein ORM, um mit ihr zu sprechen. Sie müssen keinen ORM-Code schreiben, aber es hilft zu wissen, dass er da ist:
- Ihr Datenmodell steckt im Code. Die Schema-Datei des ORMs ist oft die klarste Beschreibung der Daten Ihrer App: welche Tabellen es gibt, welche Felder sie haben und wie sie zusammenhängen. Wenn Sie sie lesen, sehen Sie schnell, ob die KI Ihre App richtig verstanden hat.
- Änderungen an der Datenbank laufen über Migrationen. Wenn Sie etwa sagen „Füge Kunden eine Telefonnummer hinzu“, passt die KI das Modell an und erzeugt eine Migration. Das erklärt, warum eine Änderung manchmal erst angewendet werden muss, bevor sie live funktioniert.
- Sicher ab Werk. ORMs bauen Abfragen so auf, dass sie vor SQL-Injection geschützt sind – eine der häufigsten Sicherheitslücken in Apps, die Abfragen von Hand zusammensetzen.
- Geschwindigkeitsfallen. ORMs machen es leicht, versehentlich Hunderte kleiner Abfragen auszuführen, wo eine gereicht hätte. Das ist ein häufiger Grund für langsame Seiten in KI-gebauten Apps.
Ein Alltagsvergleich
Stellen Sie sich einen britischen Reisenden und eine japanische Ladenbesitzerin vor, die keine gemeinsame Sprache sprechen und über einen Dolmetscher kommunizieren.
Der Reisende (Ihre App) sagt: „Ich hätte gern die drei günstigsten Tees, die Sie haben.“ Der Dolmetscher (das ORM) übersetzt das in präzises Japanisch (SQL), gibt es an die Ladenbesitzerin (die Datenbank) weiter und übersetzt die Antwort zurück ins Englische.
Der Reisende lernt kein Japanisch, und für die meisten Gespräche ist das in Ordnung. Bei einer schwierigen Verhandlung hilft es aber, direkt zu sprechen – deshalb erlauben die meisten ORMs Entwicklern, bei Bedarf rohes SQL zu schreiben.
So arbeitet ein ORM
Datenbanken wie Postgres speichern Daten in Tabellen aus Zeilen und Spalten und werden mit SQL abgefragt. Programmiersprachen arbeiten mit Objekten: einer Buchung mit einem date, einem customer und einem status. Das ORM bildet das eine auf das andere ab:
| Datenbankseite | ORM- bzw. Code-Seite |
|---|---|
Tabelle bookings | Modell Booking |
| Zeile | Ein Buchungsobjekt |
Spalte starts_at | Feld startsAt |
Fremdschlüssel customer_id | Beziehung booking.customer |
SELECT, INSERT, UPDATE, DELETE | Methoden find, create, update, delete |
Diese vier Operationen sind die CRUD-Aktionen, auf denen fast jede App aufbaut.
Ein praktisches Beispiel: Buchungen mit Prisma
Hier ist ein vereinfachtes Prisma-Schema für eine Buchungs-App eines Friseursalons. Es beschreibt zwei Tabellen und ihre Verknüpfung:
model Customer {
id Int @id @default(autoincrement())
name String
email String @unique
bookings Booking[]
}
model Booking {
id Int @id @default(autoincrement())
startsAt DateTime
service String
customer Customer @relation(fields: [customerId], references: [id])
customerId Int
}
Einfach gesagt: Ein Kunde hat einen Namen, eine eindeutige E-Mail-Adresse und viele Buchungen. Jede Buchung hat eine Startzeit, eine Leistung und gehört zu genau einem Kunden.
Jetzt soll die App „Lenas kommende Buchungen, die nächste zuerst“ anzeigen:
const bookings = await db.booking.findMany({
where: {
customer: { email: "lena@example.com" },
startsAt: { gte: new Date() },
},
orderBy: { startsAt: "asc" },
});
Das ORM macht daraus ungefähr dieses SQL, führt es aus und gibt eine Liste von Buchungsobjekten zurück:
SELECT b.* FROM "Booking" b
JOIN "Customer" c ON c.id = b."customerId"
WHERE c.email = $1 AND b."startsAt" >= $2
ORDER BY b."startsAt" ASC;
Die $1 und $2 sind Platzhalter: E-Mail-Adresse und Datum werden getrennt vom Abfragetext gesendet. Genau das verhindert SQL-Injection.
Migrationen
Wenn Sie danach sagen „Lass Kunden eine Telefonnummer hinzufügen“, ergänzt die KI im Modell Customer das Feld phone String? (das ? bedeutet optional) und erzeugt eine Migration – ein kleines SQL-Skript wie ALTER TABLE "Customer" ADD COLUMN "phone" TEXT;. Migrationen werden der Reihe nach gespeichert, sodass jede Kopie der Datenbank auf denselben Stand gebracht werden kann und die Änderungshistorie erhalten bleibt.
Gängige ORMs nach Sprache
| Sprache | Gängige ORMs |
|---|---|
| TypeScript / JavaScript | Prisma, Drizzle, TypeORM, Sequelize |
| Python | SQLAlchemy, Django ORM, SQLModel |
| C# | Entity Framework Core |
| Java | Hibernate (oft über Spring Data JPA) |
| Ruby | Active Record |
ORMs unterscheiden sich darin, wie stark sie SQL verbergen. Prisma nutzt eine eigene Schema-Sprache und einen eigenen Abfragestil. Drizzle bleibt bewusst nah an der Form von SQL und ist dabei durchgehend typisiert. Schlankere Werkzeuge, sogenannte Query Builder wie Knex oder Kysely für TypeScript, helfen, SQL im Code zu bauen, ohne Zeilen vollständig auf Objekte abzubilden.
Wichtige Begriffe
| Begriff | Bedeutung |
|---|---|
| Modell | Die Code-Definition einer Tabelle und ihrer Felder. |
| Schema | Die vollständige Beschreibung aller Tabellen, Felder und Beziehungen. |
| Beziehung | Eine Verknüpfung zwischen Modellen, etwa eine Buchung, die zu einem Kunden gehört. |
| Migration | Ein versioniertes Skript, das die Datenbankstruktur ändert. |
| Query Builder | Ein schlankeres Werkzeug, das SQL im Code baut, ohne die volle Objektabbildung. |
| N+1-Problem | Eine Abfrage für eine Liste, dann eine weitere für jeden Eintrag – bei großen Datenmengen langsam. |
| Rohes SQL | Von Hand geschriebenes SQL, wenn das ORM im Weg steht. |
Häufige Missverständnisse
- „Ein ORM ist eine Datenbank.“ Nein. Es ist ein Übersetzer. Sie brauchen weiterhin eine Datenbank wie Postgres.
- „Mit einem ORM muss man die Daten nicht verstehen.“ Schlecht entworfene Tabellen sind über ein ORM genauso schmerzhaft. Ein gutes Datenmodell ist wichtiger als das Werkzeug.
- „ORMs sind immer langsam.“ Alltägliche Abfragen sind unproblematisch. Langsamkeit kommt meist von Mustern wie N+1-Abfragen oder fehlenden Indizes, und die lassen sich beheben.
- „Ein ORM bedeutet nie ein SQL-Injection-Risiko.“ Die Standardmethoden eines ORMs sind sicher, aber rohes SQL mit eingefügten Benutzereingaben bleibt gefährlich.
- „Wenn ich die Schema-Datei ändere, ändert sich die Live-Datenbank.“ Nur wenn eine Migration erstellt und auf diese Datenbank angewendet wurde.
Was Sie Ihren KI-App-Builder fragen sollten
- „Zeig mir das Datenbankschema und erkläre jede Tabelle und jede Beziehung in einfacher Sprache.“
- „Welches ORM verwendet dieses Projekt, und wo liegen die Migrationen?“
- „Sag mir vor jeder Tabellenänderung, ob bestehende Daten betroffen sind, und lösche nie eine Spalte mit Daten, ohne vorher nachzufragen.“
- „Prüfe die langsamsten Seiten auf N+1-Abfragen und ergänze Indizes, wo Listen gefiltert oder sortiert werden.“
- „Stelle sicher, dass jede Abfrage mit Benutzereingaben über das ORM oder Parameter läuft – keine zusammengesetzten SQL-Strings.“
ORMs in Mythex
Wenn Ihre App Daten speichern muss, fügt Mythex dem Projekt eine eigene Postgres-Datenbank hinzu – fragen Sie im Chat oder nutzen Sie den Befehl /database – und hinterlegt deren Verbindungsdaten im Workspace und in der veröffentlichten App (Datenbank). Der Agent schreibt dann den Code, der Ihre Daten liest und speichert. Wenn Sie eine Präferenz haben – „nimm Prisma“, „nimm SQLAlchemy“ oder „reines SQL, kein ORM“ –, sagen Sie es im Chat. Bitten Sie den Agenten, Ihnen das Schema zu erklären, wann immer Sie die Struktur prüfen möchten; die Dateien können Sie im Code-Editor lesen. Für das große Ganze lesen Sie Was ist eine Datenbank und SQL vs. NoSQL.
Fragen
Was ist ein ORM einfach gesagt?
Ein ORM (Object-Relational Mapper) ist eine Code-Bibliothek, die zwischen Ihrer App und einer relationalen Datenbank sitzt. Entwickler lesen und speichern Daten als gewöhnliche Objekte ihrer Programmiersprache, und das ORM schreibt die SQL-Abfragen im Hintergrund für sie.
Welche Beispiele für ORMs gibt es?
Bekannte ORMs sind Prisma und Drizzle für TypeScript und JavaScript, SQLAlchemy und der Django ORM für Python, Entity Framework Core für C#, Hibernate für Java und Active Record in Ruby on Rails.
Ist ein ORM besser als SQL von Hand zu schreiben?
Das hängt von der Aufgabe ab. Ein ORM macht alltägliche Lese- und Schreibvorgänge schneller zu programmieren, sicherer und leichter zu ändern. Handgeschriebenes SQL bietet dagegen volle Kontrolle für komplexe Auswertungen oder performancekritische Abfragen. Die meisten ORMs erlauben es, bei Bedarf auf rohes SQL zurückzugreifen.
Was ist eine Migration?
Eine Migration ist ein kleines, versioniertes Skript, das die Struktur der Datenbank ändert, etwa indem es eine Tabelle oder eine Spalte hinzufügt. ORMs können Migrationen aus Ihrem Datenmodell erzeugen, damit jede Kopie der Datenbank – auf dem Laptop, beim Testen und in der Produktion – dieselbe Struktur hat.