Einleitung: Warum Rust und Datenbanken ein perfektes Paar sind
Rust ist eine moderne Systemprogrammiersprache, die aufgrund ihrer Leistung, Speichersicherheit und Nullkosten-Abstraktionen zunehmend an Beliebtheit gewinnt. Viele Entwickler, die aus der Welt von Python, JavaScript oder Go kommen, stellen die Frage: Wie arbeitet man mit Datenbanken in Rust? Die Antwort ist einfach: Rust bietet leistungsstarke und sichere Treiber für die Arbeit mit sowohl relationalen (PostgreSQL) als auch dokumentenorientierten (MongoDB) Datenbanken.
In diesem Artikel behandeln wir die Grundlagen der Arbeit mit PostgreSQL und MongoDB in Rust. Sie lernen, wie Sie ein Projekt einrichten, eine Verbindung zu Datenbanken herstellen und grundlegende CRUD-Operationen durchführen. Der Artikel richtet sich an Anfänger, daher verwenden wir einfache und verständliche Beispiele.
1. Projekteinrichtung und Abhängigkeiten installieren
Stellen Sie vor dem Start sicher, dass Rust und Cargo installiert sind. Erstellen Sie ein neues Projekt:
cargo new rust_db_examplecd rust_db_exampleÖffnen Sie die Datei Cargo.toml und fügen Sie die notwendigen Abhängigkeiten hinzu. Für die Arbeit mit PostgreSQL verwenden wir die tokio-postgres-Crate (async Treiber) und serde für die Datenserialisierung. Für MongoDB verwenden wir den offiziellen mongodb-Treiber.
[dependencies]tokio = { version = "1", features = ["full"] }tokio-postgres = "0.7"serde = { version = "1", features = ["derive"] }serde_json = "1"mongodb = "2.8"Hinweis: Wir verwenden tokio als async-Laufzeitumgebung, da beide Treiber asynchron arbeiten. Dies ist gängige Praxis für moderne Rust-Anwendungen.
2. Arbeiten mit PostgreSQL in Rust
PostgreSQL ist eine leistungsstarke relationale Datenbank. Für die Arbeit damit in Rust verwenden wir die tokio-postgres-Crate. Sie bietet eine asynchrone Schnittstelle zum Ausführen von SQL-Abfragen.
2.1 Verbindung zur Datenbank herstellen
Erstellen wir eine Funktion zur Verbindung mit einer lokalen PostgreSQL-Datenbank. Stellen Sie sicher, dass ein PostgreSQL-Server läuft und eine Datenbank erstellt wurde (z. B. test_db):
use tokio_postgres::{NoTls, Error};
#[tokio::main]async fn main() -> Result<(), Error> { // Verbindungszeichenfolge: postgresql://benutzer:passwort@localhost/dbname let (client, connection) = tokio_postgres::connect( "host=localhost user=postgres dbname=test_db", NoTls, ).await?;
// Die Verbindung im Hintergrund ausführen tokio::spawn(async move { if let Err(e) = connection.await { eprintln!("Verbindungsfehler: {}", e); } });
println!("Verbindung zu PostgreSQL hergestellt!"); Ok(())}2.2 Eine Tabelle erstellen und Daten einfügen
Erstellen wir nun eine users-Tabelle und fügen einige Datensätze ein:
// Tabelle erstellenclient .execute( "CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(150) UNIQUE NOT NULL )", &[], ) .await?;
// Daten einfügenlet name = "Alice";let email = "alice@example.com";client .execute( "INSERT INTO users (name, email) VALUES ($1, $2)", &[&name, &email], ) .await?;
println!("Benutzer {} hinzugefügt!", name);2.3 Daten lesen und aktualisieren
Führen wir eine SELECT-Abfrage aus und aktualisieren einen Datensatz:
// Daten lesenlet rows = client .query("SELECT id, name, email FROM users", &[]) .await?;
for row in rows { let id: i32 = row.get(0); let name: &str = row.get(1); let email: &str = row.get(2); println!("ID: {}, Name: {}, E-Mail: {}", id, name, email);}
// Einen Datensatz aktualisierenclient .execute( "UPDATE users SET email = $1 WHERE name = $2", &[&"alice_new