Her er en guide til at hjælpe dig i gang med at bruge SQL-databaser i Rust.
Efterhånden som du bygger flere Rust-programmer, skal du muligvis interagere med databaser til datalagring og hentning.
Rusts stærke skrivning, hukommelsessikkerhed og ydeevne kombineret med dens understøttelse af asynkrone operationer, ORM'er og migrationer, muliggør effektiv og skalerbar databehandling, hvilket gør Rust til et fremragende valg til opbygning af database applikationer.
Introduktion til brug af SQL-databaser i Rust
Der er mange databasekasser og biblioteker i Rust-økosystemet, der understøtter de forskellige databaseparadigmer.
For SQL-databaser kan du vælge mellem databasedrivere som f.eks Libpq, Mysql-stik, og SQLite3 der giver en grænseflade til Rust-programmer til at interagere med databaser direkte uden noget abstraktionslag på SQL og ORM'er (Object-Relational Mappers) som f.eks. Diesel, Sqlx, og Rust-postgres der giver en bekvem måde at arbejde med database over Rustdatatyper såsom strukturer og funktioner.
Diesel ORM er en af de mest populære databasepakker i Rust-økosystemet. Som en ORM tilbyder Diesel funktioner fra opbygning og udførelse af forespørgsler til modeldefinition og databaseskemamigrering, hvilket gør det nemmere for dig at interagere med databaser og skrive effektiv, ren og nem at vedligeholde kode.
Diesel understøtter også flere databasemotorer inklusive PostgreSQL, MySQL og SQLite, og giver et robust sæt funktioner til håndtering af komplekse databaseoperationer som transaktioner, joinforbindelser og aggregerede funktioner.
Med kraftfulde værktøjer, funktioner og fremragende dokumentation er Diesel blevet et go-to-valg for mange Rust-udviklere, der ønsker at bygge robuste og skalerbare datadrevne applikationer.
Kom godt i gang med diesel
Du bliver nødt til at tilføje diesel og dotenv kasser til dit projekts afhængigheder i afhængighedsafsnittet i din cargo.toml fil.
[afhængigheder]
diesel = { version = "1.4.4", funktioner = ["sqlite"] }
dotenv = "0.15.0"
Efter at have tilføjet kasserne som afhængigheder, skal du installere diesel_cli CLI-værktøj til at interagere med Diesel.
Kør denne kommando for at installere diesel_cli værktøj:
last installer diesel_cli
Du kan kalde CLI-værktøjet med diesel kommando efter installation af værktøjet.
Opret derefter en fil med miljøvariabler og angiv din database-URL.
Kør denne kommando for at oprette og indsætte databasens URL for en SQLite-database i hukommelsen.
echo DATABASE_URL=database.db > .env
For at arbejde med Diesel skal du installere sqlite3 eller din foretrukne database på din computer.
Kør endelig Opsætning kommando til Diesel til at oprette en database til dit projekt:
diesel opsætning
Det Opsætning kommandoen opretter en migrationer mappe, opretter den database, der er angivet i DATABASE_URL, og kører eksisterende migreringer.
Opsætning af migreringer med diesel
Efter opsætning af din database med Diesel, vil du bruge migration generere kommando til at generere migreringsfiler. Du tilføjer navnet på filen som et argument:
diesel migration generere create_humans
Kommandoen genererer to SQL-filer i migrationer vejviser: up.sql og ned.sql.
Du vil skrive SQL for dine databasetabeldefinitioner i up.sql fil:
-- Din SQL går her
SKABBORD"human"
(
"id" HELTAL IKKE NULL PRIMÆR NØGLE AUTOINCREMENT,
"fornavn" TEXT NOT NULL,
"efternavn" TEXT NOT NULL,
"alder" HELTAL IKKE NULL
);
Du skriver SQL-kode for at slippe databasetabeller i ned.sql fil:
-- down.sql
-- Denne fil bør fortryde alt i `up.sql`
DRÅBEBORD"human"
Når du har skrevet SQL-filerne, skal du køre migration køre kommando til at anvende afventende migreringer.
diesel migration køre
Derudover kan du bruge migration om kommando for at gendanne migreringer:
diesel migration om
Du kan også bruge print-skema kommando for at udskrive skemaet. Kommandoen udskriver indholdet af schema.rs fil.
diesel print-skema
Outputtet af print_skema kommandoen er Rust-kode, der matcher dit SQL-skema:
Opret forbindelse til din SQL-database med diesel
Først skal du tilføje disse importer og direktiver til din fil:
mod skema;
#[makro_brug]
eksternkasse diesel;
brug dotenv:: dotenv;
brug diesel:: optakt::*;
brug std:: env;
brug Diesel::{Connection, ExpressionMethods, QueryDsl, RunQueryDsl, SqliteConnection};
brug kasse:: skema:: menneske;
Du skal bruge importerne og direktiverne til at oprette forbindelse til din database og udføre handlinger.
Sådan kan du oprette forbindelse til en SQLite-database med en funktion og returnere en forbindelsesforekomst:
brug std:: env;
brug diesel::{Connection, SqliteConnection};fnetablere_forbindelse() -> SqliteConnection {
dotenv().ok();
lade database_url = env:: var("DATABASE_URL")
.forventer("DATABASE_URL skal indstilles");
SqliteConnection:: establish(&database_url)
.unwrap_or_else(|_| panik!("Fejl ved forbindelse til {}", database_url))
}
Det etablere_forbindelse funktion returnerer forbindelsesinstansstrukturen (SqliteConnection). Det etablere_forbindelse indlæser miljøvariablerne med Okay funktion, får adgang til databasens URL med var funktion, og etablerer en forbindelse med databasen via URL'en med etablere fungere.
Efter en vellykket forbindelse kan du udføre forespørgsler og indsætte dem i din database.
Indsættelse af værdier til en database med diesel
Du skal bruge en struktur, der matcher dit SQL-skema til at indsætte værdier i din database.
Her er en struktur, der matcher human tabel skema:
#[aflede (kan forespørges)]
pubstrukturHuman {
pub id: i32,
pub fornavn: Snor,
pub efternavn: Snor,
pub alder: i32,
}
Indsættelsesfunktionen returnerer en forekomst af Human type til andre operationer.
Du skal bruge en struktur til din indsættelsesfunktion; strukturen vil implementere to makroattributter, en til indsættelsesfunktionalitet og den anden, der identificerer tabellen for operationen.
Her er strukturen for indsættelsesoperationen:
#[aflede (kan indsættes)]
#[tabel_navn = "human"]
strukturNewHuman<'en> {
fornavn: &'enstr,
efternavn: &'enstr,
alder: i32,
}
Din indsættelsesfunktion vil tage en forbindelsesforekomst og de data, du vil indsætte i databasen. Indsæt dataene og udskriv en meddelelse baseret på status for operationen.
fnindsæt_i<'en>(tilslutning: &SqliteConnection, fornavn: &'enstr, efternavn: &'enstr, alder: i32) -> Menneske {
brug kasse:: skema:: menneske;lade new_human = NewHuman {
fornavn,
efternavn,
alder,
};diesel:: insert_into (human:: table).values(&new_human).execute (conn).expect("Fejl ved indsættelse af nyt menneske");
human:: table.order (human:: id.desc()).first (conn).unwrap()
}
Det indsæt_i funktion tager parametrene ind og indsætter værdierne i databasen med Diesels indsæt_i funktion, der tager i tabellen og den værdier funktion, der tager en struct-instans. Funktionen tildeler ID'et i faldende rækkefølge med desc funktion, før handlingen udføres.
Her er vigtigste funktion, der kalder indsæt_i fungere:
fnvigtigste() {
lade conn = etablere_forbindelse();
lade new_human = insert_into(&conn, "John", "Då", 25);
println!("Nyt menneske indsat med ID: {}", new_human.id);
}
Det forb variabel er en forbindelsesforekomst, og nyt_menneske variabel er funktionskaldet. Det vigtigste funktion udskriver ID'et efter en vellykket handling.
Forespørgsel i databaser med diesel
Alternativt vil din forespørgselsfunktion struct implementere Forespørgeligt egenskab med en udlede makro.
Her er strukturen for forespørgselsoperationen:
// Definer en struktur, der repræsenterer en række i din tabel
#[aflede (kan forespørges)]
strukturHuman {
id: i32,
fornavn: Snor,
efternavn: Snor,
alder: i32,
}
Forespørgselsfunktionen vil tage en forbindelsesinstans ind og returnere en Human struktur som følger:
fnforespørgsel_db(forbindelse: &SqliteConnection) -> Human {
human.filter (age.eq(25)).first (conn).expect("Fejl ved forespørgsel efter database")
}
Det forespørgsel_db funktion filtrerer den menneskelige tabel for rækken, hvor alder er lig med 25 og returnerer den første forekomst som en struct-forekomst.
fnvigtigste() {
lade conn = etablere_forbindelse();
lade person = query_db(&conn);
println!("ID: {}", person.id);
println!("Fornavn: {}", person.fornavn);
println!("Efternavn: {}", person.efternavn);
println!("Alder: {}", person.alder);
}
I den vigtigste funktion, den person variabel kalder forespørgsel_db funktion og udskriver felterne i rækken med en aldersværdi lig med 25.
Du kan bygge webservere med rust
Rust fortsætter med at vinde popularitet i webudvikling som et server-side sprog med biblioteker som Actix-web og Raket der gør det nemmere at opsætte servere og bygge API'er og websteder ved at abstrahere kompleks funktionalitet.
De fleste webservere skal interagere med databaser for datalagring og -hentning. Du kan yderligere integrere dine Diesel-drevne apps med Actix-web eller Rocket for at bygge sofistikerede webapplikationer.