Sooo, nun habe ich einen weiteren Step in meiner „Rust“ Erfahrung gemacht, ich möchte meine Reise wieder mit euch teilen:
Wie kann ich mit Rust und Diesel auf eine PostgreSQL Datenbank zugreifen? Das erkläre ich euch nachstehend:
Wie wir Diesel installieren, habe ich im Beitrag https://www.predl.cc/rust-diesel-fuer…ows-installieren/ erklärt, bitte da starten, falls Diesel noch nicht am PC ist. Die Rust Installation habe ich kurz am Anfang des Beitrages angerissen, jedoch denke ich von dem Punkt kommt jeder weiter…
Zuerst einmal erstellen wir unser erstes Projekt. Wir öffnen ein cmd Fenster und schreiben
cargo new diesel_example
Dann cd ins Verzeichnis:
cd diesel_example
So nun ist das Projekt erstellt, wir finden nun im Verzeichnis folgende Dateien (nur die Wichtigsten!):
diesel_example/
|-- Cargo.toml # Unsere Konfigurationsdatei fürs Projekt
|-- src/
| |-- main.rs # Das Projekt main.rs, hier startet alles
So nun können wir erstmal die Cargo.toml öffnen:
[package]
name = "diesel_example"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
Das ändern wir auf:
[package]
name = "diesel_example"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
diesel = { version = "*", features = ["postgres"] }
dotenv = "*"
diesel_codegen = "*" # Füge diesel_codegen hinzu
Damit haben wir bereits Diesel als Abhängigkeit hinzugefügt, codegen erlaubt uns, die Schema.rs automatisch aus der Datenbank zu erstellen, sehr nützlich.
dann erstellen wir eine .env Datei und schreiben hinein:
{password} bitte mit Ihrem Passwort ersetzen.
Dann müssen wir noch die main.rs aus dem src Verzeichnis ändern:
extern crate diesel;
extern crate dotenv;
use diesel::prelude::*;
use dotenv::dotenv;
use std::env;
table! {
users (user_id) {
user_id -> Int8,
user_name -> Varchar,
user_password -> Varchar,
}
}
//use schema::users;cls
// Diesel-Verbindung initialisieren
fn establish_connection() -> PgConnection {
dotenv().ok();
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL not found in .env");
PgConnection::establish(&database_url)
.expect(&format!("Error connecting to {}", database_url))
}
fn main() {
let mut connection = establish_connection();
// Hier verwenden wir Diesel-Abfragen, um alle Benutzer aus der Tabelle "users" abzurufen
let all_users = users::table.load::<(i64, String, String)>(&mut connection) // mutable Verweis
.expect("Error loading users");
for user in all_users {
let (user_id, user_name, user_password) = user;
println!("User ID: {}, User Name: {}, User Password: {}", user_id, user_name, user_password);
}
}
Damit sind wir fast fertig, nur noch in pgAdmin eine datenbank anlegen, wir benennen diese einfach „diesel_example“…
CREATE TABLE IF NOT EXISTS public.users
(
user_id bigint NOT NULL DEFAULT nextval('users_user_id_seq'::regclass),
user_name character varying(35) COLLATE pg_catalog."default" NOT NULL,
user_password character varying(35) COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT users_pkey PRIMARY KEY (user_id)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.users
OWNER to postgres;
Wir können gleich ein paar Datensätze in die PostgreSQL Datenbank speichern:
insert into users (user_name, user_password) values('alex','password');
insert into users (user_name, user_password) values('admin','password');
insert into users (user_name, user_password) values('john','password');
Dann sehen wir auch eine Ausgabe vom Rust Projekt.
diesel setup
Damit wird die migration erstellt (also eine Datenbank Versions Kontrolle)
diesel migration run
Das erstellt die schema.rs im /src Verzeichnis! Das ist die Struktur der Tabellen, die brauchen wir später
cargo run
Damit startet man dann das Projekt, zuerst wird laaaange kompiliert und dann ausgeführt, später dauert der Vorgang nicht mehr so lange, da verwendet Cargo die bereits kompilierten Komponenten und das geht viel schneller.
Die Ausgabe:
Dauert etwa 3-4 Minuten, nachdem aber das Projekt erstellt wurde, geht es wesentlich schneller:
Finished dev [unoptimized + debuginfo] target(s) in 0.16s
Running `target\debug\diesel_example.exe`
User ID: 1, User Name: alex, User Password: password
User ID: 2, User Name: admin, User Password: password
User ID: 3, User Name: john, User Password: password
Dann nur mehr Sekunden…
cargo build
Das Projekt wird nur kompiliert, keine Ausführung.
cargo clean
Falls sich die Importe stark ändern, es sich ein Fehler eingeschlichen hat usw. kann man wieder von vorne anfangen.
Getestet unter Windows 10 (wird unter Windows 11 sicher auch gehen!), müsste aber auch so in Linux funktionieren…
Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.
Zuerst einmal, Cargo ist für Rust zuständig Module zu installieren.
Diesel ist ein Modul für Rust, Diesel erleichtert die Datenbankzugriffe.
Diesel unterstützt PostgreSQL, MySQL und SQLite, darin liegt aber der „Hund“ begraben… wir sollten alle 3 Datenbanken auf unserem PC installiert haben. Aber das ist nur die 1/2 Miete…
Wir brauchen die libpq.lib, die libmysql.lib und die sqlite3.lib. Besser gesagt, wir müssen für Cargo die Pfade über die Windows Variablen setzen.
Anmerkung: Ich verwende unter Windows Everything, das kann man von https://www.voidtools.com/ herunterladen. Ehrlich, ich wüsste nicht, was ich ohne dieses super Tool machen sollte, die Windows Dateisuche ist ja sowas von am A****… ist elendig langsam, findet nichts und noch dazu 100% CPU, wenn irgendwas WSearch nicht passt…
PostgreSQL:
C:\Program Files\PostgreSQL\15\lib\libpq.lib
Diesen Pfad müssen wir Cargo als CMD Variable übermitteln: (Pfad selbst anpassen bitte, falls Sie PostgreSQL 16+ oder älter haben!
SET PQ_LIB_DIR=C:\Program Files\PostgreSQL\15\lib
Dann noch SQL-Lite, das ist nicht sooo einfach, dafür muss man das Windows SDK installieren, sonst muss man selbst die sqlite3.lib kompilieren… Alternativ kann man von https://github.com/buggins/ddbc das ganze Paket downloaden und entpacken, im Verzeichnis ist bei mir C:\Users\Alex\Downloads\ddbc-master\ddbc-master\libs\win64 die sqlite3.lib enthalten… aber ich hab die sqlite3.lib vom Windows-SDK genommen
SET SQLITECLIENT_LIB_DIR=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\um\x64
SET MYSQLCLIENT_LIB_DIR=C:\Users\Alex\Downloads\mysql-connector-c-6.1.11-winx64\mysql-connector-c-6.1.11-winx64\lib\vs14
Die Pfade unter Anführungszeichen „“ zu setzen, wie es in Windows mit Pfaden mit Leerzeichen so üblich ist, war hier nicht notwendig!
Danach konnte ich erfolgreich Diesel mit Cargo installieren:
cargo install diesel_cli
Nachdem ich auf einer „nackten“ Windows 10 VM das Ganze noch einmal ausprobiert habe, konnte ich trotzdem ich die sqlite3.lib in der 64-bit Version habe und die SET SQLITECLIENT_LIB_DIR korrekt auf das Verzeichnis gesetzt habe, konnte ich immer noch nicht Diesel installieren, ein wenig suchen später:
cargo install diesel_cli --no-default-features --features "sqlite-bundled mysql postgres" --force
Man nimmt die in Cargo eingebaute SQ-Lite, liefert immer die aktuelle bzw. die gesuchte sqlite3.lib…
Um mehr Output und Fehlersuche für Cargo zu ermöglichen, kann man das Log aktivieren, das macht man mit:
SET CARGO_LOG=trace cargo fetch
Getestet unter Windows 10 (wird unter Windows 11 sicher auch gehen!)
Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.