Datenbankmigrationen in TypeScript: TypeORM, Prisma und Drizzle

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Datenbankmigrationen in TypeScript: Vollständiger Überblick über Tools und praktischer Leitfaden

\n\n

Datenbankmigrationen sind eine Methode zur Versionierung und schrittweisen Anwendung von Schemaänderungen der Datenbank (Erstellen, Ändern oder Löschen von Tabellen, Indizes und Constraints). Im TypeScript-Ökosystem gibt es mehrere leistungsstarke Tools zur Verwaltung von Migrationen. In diesem Artikel werden wir die drei beliebtesten Lösungen im Detail analysieren: TypeORM, Prisma und Drizzle ORM.

\n\n

Wozu sind Migrationen nötig?

\n

Ohne Migrationen nehmen Entwickler Änderungen oft manuell über die SQL-Konsole oder das Admin-Panel vor, was zu Folgendem führt:

\n
    \n
  • Verlust der Synchronisation zwischen Entwicklungs- und Produktionsumgebung;
  • \n
  • Fehlern aufgrund menschlicher Faktoren;
  • \n
  • Schwierigkeiten beim Rückgängigmachen von Änderungen.
  • \n
\n

Migrationen lösen diese Probleme, indem sie das automatische Anwenden und Zurücksetzen von Änderungen ermöglichen und die Historie aller Schemaänderungen im Code speichern.

\n\n

1. TypeORM – Klassischer Ansatz mit ActiveRecord und Data Mapper

\n

TypeORM ist einer der ausgereiftesten ORMs für TypeScript und JavaScript. Es unterstützt sowohl das ActiveRecord- als auch das Data-Mapper-Muster und verfügt über ein integriertes Migrationssystem.

\n\n

Installation und Einrichtung

\n
npm install typeorm reflect-metadata @types/node\nnpm install pg  # für PostgreSQL
\n\n

Erstellen Sie eine Konfigurationsdatei ormconfig.json oder verwenden Sie data-source.ts:

\n
import { DataSource } from "typeorm";\n\nexport const AppDataSource = new DataSource({\n    type: "postgres",\n    host: "localhost",\n    port: 5432,\n    username: "user",\n    password: "password",\n    database: "mydb",\n    entities: ["src/entity/*.ts"],\n    migrations: ["src/migration/*.ts"],\n    synchronize: false,  // Autosynchronisierung deaktivieren\n});
\n\n

Erstellung und Ausführung einer Migration

\n

Generieren Sie zunächst eine Migration basierend auf Änderungen an den Entitäten:

\n
npx typeorm migration:generate src/migration/AddUserTable -d src/data-source.ts
\n\n

Beispiel einer generierten Migration:

\n
import { MigrationInterface, QueryRunner, Table } from "typeorm";\n\nexport class AddUserTable1234567890 implements MigrationInterface {\n    public async up(queryRunner: QueryRunner): Promise<void> {\n        await queryRunner.createTable(\n            new Table({\n                name: "user",\n                columns: [\n                    { name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" },\n                    { name: "name", type: "varchar", length: "255" },\n                    { name: "email", type: "varchar", isUnique: true },\n                ],\n            })\n        );\n    }\n\n    public async down(queryRunner: QueryRunner): Promise<void> {\n        await queryRunner.dropTable("user");\n    }\n}
\n\n

Wenden Sie die Migration an:

\n
npx typeorm migration:run -d src/data-source.ts
\n\n

Vor- und Nachteile von TypeORM

\n
    \n
  • Vorteile: großes Ökosystem, viele Datenbanken (PostgreSQL, MySQL, SQLite, MSSQL), Generierung von Migrationen aus Entitäten.
  • \n
  • Nachteile: komplexe Konfiguration, langsame Arbeitsgeschwindigkeit bei vielen Entitäten, veraltete Codebasis.
  • \n
\n\n

2. Prisma – Modernes ORM mit automatischen Migrationen

\n

Prisma ist der neue Standard in TypeScript ORM. Es verwendet ein deklaratives Schema (schema.prisma) und generiert automatisch Migrationen.

\n\n

Installation und Initialisierung

\n
npm install prisma @prisma/client\nnpx prisma init
\n\n

Definieren Sie das Modell in prisma/schema.prisma:

\n
generator client {\n    provider = "prisma-client-js"\n}\n\ndatasource db {\n    provider = "postgresql"\n    url      = env("DATABASE_URL")\n}\n\nmodel User {\n    id                    

Empfehlungen