Dieses Projekt zeigt ein einfaches Beispiel für die Nutzung von PostgreSQL mit der Rust-Bibliothek tokio-postgres
. Es enthält eine Datenbankverbindung, eine Transaktion zum Einfügen von Daten und grundlegende Abfragen.
Um dieses Projekt auszuführen, benötigen Sie:
- Rust: Installieren Sie die neueste Version von Rust mit rustup.
- Docker: Installieren Sie Docker und Docker Compose, um die PostgreSQL-Datenbank aufzusetzen.
src/main.rs
: Der Rust-Code mit der Verbindung zur PostgreSQL-Datenbank und einem Beispiel für Transaktionen.Cargo.toml
: Die Projektabhängigkeiten.
Klonen Sie dieses Repository und wechseln Sie in das Verzeichnis:
git clone https://github.com/FelixWieland/dhbw-ti23-rust-postgres
cd dhbw-ti23-rust-postgres
Installieren Sie die Abhängigkeiten:
cargo build
Passen Sie user
, password
und dbname
entsprechend an, wenn Sie andere Werte in docker-compose.yml
verwendet haben.
-
Starten Sie die PostgreSQL-Datenbank mit Docker Compose (falls noch nicht geschehen):
docker-compose up -d
-
Führen Sie das Programm aus:
cargo run
Wenn alles korrekt eingerichtet ist, sollten Sie in der Konsole eine Bestätigung über den erfolgreichen Datenbankeintrag sehen:
Tabelle 'users' erstellt.
Transaktion gestartet.
Daten eingefügt: Name = Bob, Alter = 25.
Daten aktualisiert: Name = Bob, Alter = 30.
Abgefragte Daten - ID: 2, Name: Bob, Alter: 30
Daten gelöscht: Name = Bob.
Transaktion erfolgreich festgeschrieben.
Die Verbindung zur Datenbank wird mit tokio-postgres
hergestellt:
let (client, connection) = tokio_postgres::connect(
"host=localhost user=postgres password=postgres dbname=postgres",
NoTls,
)
.await?;
host
: Die IP oder der Hostname der Datenbank (localhost
für Docker Compose).user
: Der Benutzername (postgres
).password
: Das Passwort (postgres
).dbname
: Der Name der Datenbank (postgres
).
Die Verbindung läuft in einem separaten Task, um die Asynchronität zu gewährleisten.
Daten werden in einer Transaktion eingefügt:
let transaction = client.transaction().await?;
transaction
.execute(
"INSERT INTO users (name, age) VALUES ($1, $2)",
&[&"Bob", &25],
)
.await?;
transaction.commit().await?;
$1
und$2
sind Platzhalter für Parameter.- Die Parameter werden als Referenzen übergeben, z. B.
&"Bob"
und&25
.
Ein Beispiel für eine Abfrage und den Abruf von Daten:
let row = client
.query_one("SELECT name FROM users WHERE id = $1", &[&1])
.await?;
let name: String = row.get(0);
println!("User name: {}", name);
-
Container stoppen:
docker-compose down
-
Logs anzeigen:
docker-compose logs
Um sich mit der Datenbank zu verbinden:
docker exec -it rust_postgres_example_db psql -U postgres -d postgres
-
Verbindungsfehler:
- Stellen Sie sicher, dass der Docker-Container läuft:
docker ps
- Prüfen Sie die Verbindung zu
localhost:5432
.
- Stellen Sie sicher, dass der Docker-Container läuft:
-
Typfehler bei Parametern:
- Vergewissern Sie sich, dass die Typen der Rust-Parameter mit den Datenbankspalten übereinstimmen (z. B.
i32
fürINTEGER
).
- Vergewissern Sie sich, dass die Typen der Rust-Parameter mit den Datenbankspalten übereinstimmen (z. B.
-
Keine Berechtigungen:
- Prüfen Sie Benutzername und Passwort in
docker-compose.yml
und im Rust-Code.
- Prüfen Sie Benutzername und Passwort in
- Erweiterung des Codes, um mehrere Tabellen und komplexere Queries zu handhaben.
- Einsatz von Migrations-Tools wie
diesel
odersqlx
für Schemaänderungen. - Automatische Tests mit einer isolierten Testdatenbank.