Datenbankmigrationen in Rust: Überblick über Tools und Bibliotheken

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 Rust: Überblick über Tools und Bibliotheken

\n\n

Bei der Entwicklung jeder Anwendung wird früher oder später die Notwendigkeit entstehen, die Datenbankstruktur zu ändern. Das Hinzufügen neuer Spalten, das Erstellen von Indizes oder das Umbenennen von Tabellen – all dies erfordert eine sorgfältige Versionsverwaltung des Schemas. Im Rust-Ökosystem gibt es mehrere ausgereifte Lösungen zur Durchführung von Migrationen. In diesem Artikel betrachten wir die wichtigsten Ansätze und Bibliotheken, die für Aufgaben der DB-Schemaverwaltung verfügbar sind.

\n\n

Wozu sind Migrationen nötig?

\n

Migrationen ermöglichen:

\n
    \n
  • Versionierung von Änderungen – jede Migration stellt eine separate Datei mit einer Versionsnummer dar.
  • \n
  • Automatisierung des Deployments – Änderungen beim Deployment einspielen und zurücksetzen.
  • \n
  • Teamarbeit – alle Entwickler synchronisieren das Schema lokal.
  • \n
  • Vermeidung von Fehlern – Migrationen schützen vor versehentlichen Datenänderungen.
  • \n
\n\n

Wichtigste Tools für Migrationen in Rust

\n\n

1. Diesel Migration (integriert in Diesel ORM)

\n

Diesel ist das beliebteste ORM für Rust. Es bietet eine integrierte Engine für Migrationen über das CLI-Tool diesel_cli.

\n

Hauptfunktionen:

\n
    \n
  • Generierung von Migrationsdateien mit SQL-Abfragen.
  • \n
  • Unterstützung für PostgreSQL, MySQL, SQLite.
  • \n
  • Befehle: migration generate, migration run, migration redo.
  • \n
  • Automatische Nachverfolgung angewendeter Migrationen.
  • \n
\n

Beispiel für das Erstellen und Anwenden einer Migration:

\n
# CLI installieren\ncargo install diesel_cli --no-default-features --features postgres\n\n# Neue Migration erstellen\ndiesel migration generate create_users\n\n# Im Ordner migrations/ erscheinen zwei SQL-Dateien:\n# up.sql — Code zum Einspielen\n# down.sql — Code zum Zurücksetzen\n\n# Migration anwenden\ndiesel migration run
\n

Inhalt von up.sql:

\n
CREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(255) NOT NULL,\n    email VARCHAR(255) UNIQUE NOT NULL,\n    created_at TIMESTAMP DEFAULT NOW()\n);
\n

down.sql:

\n
DROP TABLE IF EXISTS users;
\n\n

2. SQLx migrate (Teil des SQLx-Ökosystems)

\n

SQLx ist ein asynchroner Treiber für SQL-Datenbanken. Sein Migrations-Subsystem arbeitet ohne ORM, nur mit reinen SQL-Skripten.

\n

Besondere Merkmale:

\n
    \n
  • Unterstützung für PostgreSQL, MySQL, SQLite, MSSQL.
  • \n
  • Integration mit CLI und programmatischer Start aus dem Code.
  • \n
  • Möglichkeit der Verwendung von Rust-Code für Prüfungen vor der Migration.
  • \n
  • Automatische Integritätsprüfung (Datei-Hashes).
  • \n
\n

Beispiel für den programmatischen Start von Migrationen in Rust:

\n
use sqlx::migrate::Migrator;\nuse sqlx::PgPool;\n\n#[tokio::main]\nasync fn main() -> Result<(), sqlx::Error> {\n    let pool = PgPool::connect("postgres://user:pass@localhost/db").await?;\n    \n    // Pfad zum Migrationsordner angeben\n    let migrator = Migrator::new(std::path::Path::new("./migrations")).await?;\n    \n    // Alle nicht angewendeten Migrationen ausführen\n    migrator.run(&pool).await?;\n    \n    println!("Migrationen erfolgreich ausgeführt!");\n    Ok(())\n}
\n

Struktur des Ordners migrations/:

\n
migrations/\n├── 20231001_initial.sql\n├── 20231002_add_email_index.sql\n└── 20231003_create_roles.sql
\n

Jede Datei enthält normales SQL, zum Beispiel:

\n
-- 20231001_initial.sql\nCREATE TABLE IF NOT EXISTS users (\n    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n    username TEXT NOT NULL UNIQUE\n);
\n\n

3. SeaORM Migrator (Teil von SeaORM)

\n

SeaORM ist ein modernes asynchrones ORM, das ein eigenes Migrationssystem SeaORM Migrator anbietet. Es ermöglicht, Migrationen in Rust statt in SQL zu schreiben, was d

Empfehlungen