Datenbankmigrationen in Rust: Überblick über die Tools Diesel, SeaORM und sqlx
Die Verwaltung von Änderungen am Datenbankschema ist eine der zentralen Aufgaben bei der Entwicklung jeder Webanwendung. Im Rust-Ökosystem gibt es hierfür mehrere ausgereifte Werkzeuge. In diesem Artikel betrachten wir drei Hauptansätze für Migrationen: Diesel, SeaORM und sqlx. Jeder bietet einen eigenen, einzigartigen Ansatz zur Verwaltung von DB-Schemaversionen, und die Wahl des richtigen Tools kann die Architektur des Projekts erheblich beeinflussen.
1. Diesel – Klassischer ORM mit integrierter Migrationsunterstützung
Diesel ist ein sicherer, erweiterbarer ORM und Query Builder für Rust, der eng in das Migrationssystem integriert ist. Sein Hauptvorteil ist die Typprüfung auf Kompilierungsebene: Tabellenstrukturen werden basierend auf dem DB-Schema generiert, was Typinkonsistenzfehler ausschließt.
Migrationen in Diesel sind einfache SQL-Dateien, die im Verzeichnis migrations/ organisiert sind. Jede Migration enthält zwei Dateien: up.sql (Anwenden der Änderungen) und down.sql (Rückgängigmachen).
Beispiel einer Migrationsstruktur zum Erstellen einer Benutzertabelle:
-- migrations/2024-01-15-120000_create_users/up.sqlCREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP NOT NULL DEFAULT NOW());
-- migrations/2024-01-15-120000_create_users/down.sqlDROP TABLE IF EXISTS users;Zum Ausführen von Migrationen wird das CLI-Tool diesel_cli verwendet:
# Installationcargo install diesel_cli --no-default-features --features postgres
# Migrationen ausführendiesel migration run
# Letzte Migration rückgängig machendiesel migration revert
# Neue Migration generierendiesel migration generate create_usersVorteile von Diesel:
- Vollständige Typprüfung zur Kompilierzeit
- Einfache und klare Migrationsstruktur (reines SQL)
- Integrierte Unterstützung für Rollbacks
- Hervorragende Leistung
Nachteile:
- Erfordert die Installation eines zusätzlichen CLI-Tools
- Komplexe Einrichtung für Projekte mit mehreren Datenbanken
- Weniger Flexibilität im Vergleich zu sqlx
2. SeaORM – Asynchroner ORM mit flexiblem Migrationssystem
SeaORM (basierend auf sea-query und sqlx) ist ein asynchroner ORM, der einen moderneren Ansatz für Migrationen bietet. Im Gegensatz zu Diesel werden Migrationen in SeaORM in Rust geschrieben, nicht in SQL, was die Nutzung der vollen Sprachleistung zur Beschreibung von Schemaänderungen ermöglicht.
Beispiel einer Migration mit SeaORM:
use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]pub struct Migration;
#[async_trait::async_trait]impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager .create_table( Table::create() .table(Users::Table) .if_not_exists() .col( ColumnDef::new(Users::Id) .integer() .not_null() .auto_increment() .primary_key(), ) .col(ColumnDef::new(Users::Username).string().not_null()) .col(ColumnDef::new(Users::Email).string().not_null()) .col( ColumnDef::new(Users::CreatedAt) .timestamp() .default(Expr::current_timestamp()), ) .to_owned(), ) Auch in der Bibliothek
GuzzleHTTP/Promises für PHP: Komplette Anleitung mit Beispielen
Doctrine ORM für PHP: Komplettguide mit Praxisbeispielen
Lottie Android Kotlin: Komplette Anleitung mit Beispielen
Objektserialisierung in Swift: Codable, NSCoding und JSONEncoder
HTML-Parsing in Swift (iOS/macOS): Bibliotheken SwiftSoup und Fuzi