Iată un ghid care vă va ajuta să începeți să utilizați bazele de date SQL în Rust.

Pe măsură ce construiți mai multe programe Rust, poate fi necesar să interacționați cu bazele de date pentru stocarea și recuperarea datelor.

Tastarea puternică, siguranța memoriei și performanța Rust, combinate cu suportul său pentru operațiuni asincrone, ORM-uri și migrațiile, permit procesarea eficientă și scalabilă a datelor, făcând din Rust o alegere excelentă pentru construirea bazei de date aplicatii.

Introducere în utilizarea bazelor de date SQL în Rust

Există multe lăzi de baze de date și biblioteci în ecosistemul Rust care oferă suport pentru diferitele paradigme de baze de date.

Pentru bazele de date SQL, puteți alege între drivere de bază de date precum Libpq, Conector Mysql, și Sqlite3 care oferă o interfață pentru ca programele Rust să interacționeze direct cu bazele de date, fără niciun strat de abstractizare pe SQL și ORM-uri (Object-Relational Mappers), cum ar fi Motorină, Sqlx, și Rust-postgres

instagram viewer
care oferă o modalitate convenabilă de a lucra cu baza de date Tipuri de date Rugină precum structuri și funcții.

Diesel ORM este unul dintre cele mai populare pachete de baze de date din ecosistemul Rust. Ca ORM, Diesel oferă funcții de la construirea și execuția interogărilor până la definirea modelului și migrarea schemei bazei de date, facilitând interacțiunea cu bazele de date și scrie cod eficient, curat și ușor de întreținut.

Suportă și Diesel mai multe motoare de baze de date, inclusiv PostgreSQL, MySQL și SQLite, și oferă un set robust de caracteristici pentru gestionarea operațiunilor complexe de baze de date, cum ar fi tranzacții, alăturari și funcții de agregare.

Cu instrumente puternice, caracteristici și documentație excelentă, Diesel a devenit o alegere de preferat pentru mulți dezvoltatori Rust care doresc să creeze aplicații robuste și scalabile bazate pe date.

Noțiuni introductive cu Diesel

Va trebui să adăugați motorină și dotenv lăzi la dependențele proiectului dvs. în secțiunea de dependențe a dvs încărcătură.toml fişier.

[dependențe]
motorină = { versiunea = "1.4.4", caracteristici = ["sqlite"] }
dotenv = "0.15.0"

După ce adăugați lăzile ca dependențe, trebuie să instalați diesel_cli Instrument CLI pentru a interacționa cu Diesel.

Rulați această comandă pentru a instala diesel_cli instrument:

cargo install diesel_cli

Puteți apela instrumentul CLI cu motorină comanda după instalarea instrumentului.

Apoi, creați un fișier cu variabile de mediu și specificați adresa URL a bazei de date.

Rulați această comandă pentru a crea și a insera adresa URL a bazei de date pentru o bază de date SQLite în memorie.

echo DATABASE_URL=database.db > .env

Pentru a lucra cu Diesel, trebuie să instalați sqlite3 sau baza de date preferată pe computer.

În cele din urmă, rulați înființat comandă pentru Diesel pentru a configura o bază de date pentru proiectul dvs.:

setare diesel

The înființat comanda creează o migraţiile director, creează baza de date specificată în DATABASE_URLși rulează migrațiile existente.

Configurarea migrațiilor cu Diesel

După configurarea bazei de date cu Diesel, veți folosi generarea migrației comandă pentru a genera fișiere de migrare. Veți adăuga numele fișierului ca argument:

migrația diesel generează create_humans

Comanda generează două fișiere SQL în fișierul migraţiile director: sus.sql și jos.sql.

Veți scrie SQL pentru definițiile tabelelor bazei de date în sus.sql fişier:

-- SQL-ul tău merge aici

CREAMASA"uman"
(
„ID” INTEGER NU NUL CHEIE PRIMARĂ AUTOINCREMENTARE,
„first_name” TEXT NOT NULL,
„nume” TEXT NOT NULL,
„Vârsta” INTEGER NOT NULL
);

Veți scrie cod SQL pentru a arunca tabelele bazei de date în jos.sql fişier:

-- down.sql

-- Acest fișier ar trebui să anuleze orice în `up.sql`
CĂDERE BRUSCAMASA"uman"

După ce ați scris fișierele SQL, rulați rularea migrației comandă pentru a aplica migrațiile în așteptare.

rulare de migrare a motorinei

În plus, puteți utiliza refacerea migrației comandă pentru a anula migrarea:

reface migrarea motorinei

De asemenea, puteți utiliza print-schema comanda pentru a tipări schema. Comanda imprimă conținutul fișierului schema.rs fişier.

schema de imprimare diesel

Ieșirea lui print_schema comanda este codul Rust care se potrivește cu schema dvs. SQL:

Conectarea la baza de date SQL cu Diesel

Mai întâi, adăugați aceste importuri și directive în fișierul dvs.:

mod schemă;

#[macro_use]
externladă motorină;
utilizare dotenv:: dotenv;
utilizare diesel:: preludiu::*;
utilizare std:: env;
utilizare Diesel::{Conexiune, ExpressionMethods, QueryDsl, RunQueryDsl, SqliteConnection};
utilizare crate:: schema:: uman;

Veți folosi importurile și directivele pentru a vă conecta la baza de date și a efectua operațiuni.

Iată cum vă puteți conecta la o bază de date SQLite cu o funcție și puteți returna o instanță de conexiune:

utilizare std:: env;
utilizare diesel::{Conexiune, SqliteConnection};

fnstabilire_conectare() -> SqliteConnection {
dotenv().ok();

lăsa database_url = env:: var(„DATABASE_URL”)
.aştepta(„DATABASE_URL trebuie setat”);
SqliteConnection:: stabilire(&database_url)
.unwrap_or_else(|_| panică!(„Eroare la conectarea la {}”, database_url))
}

The stabilire_conectare funcția returnează structura instanței de conexiune (SqliteConnection). The stabilire_conectare încarcă variabilele de mediu cu Bine funcția, accesează adresa URL a bazei de date cu var funcția și stabilește o conexiune cu baza de date prin adresa URL cu a stabili funcţie.

După o conexiune reușită, puteți executa interogări și le puteți introduce în baza de date.

Inserarea valorilor într-o bază de date cu motorină

Veți folosi o structură care se potrivește cu schema dvs. SQL pentru a insera valori în baza de date.

Iată o structură care se potrivește cu uman schema tabelului:

#[derivare (interogabil)]
cârciumăstructUman {
cârciumă id: i32,
cârciumă Nume: Şir,
cârciumă nume: Şir,
cârciumă vârstă: i32,
}

Funcția de inserare va returna o instanță a Uman tip pentru alte operațiuni.

Veți avea nevoie de o structură pentru funcția de inserare; structura va implementa două atribute macro, unul pentru funcționalitatea de inserare și celălalt care identifică tabelul pentru operație.

Iată structura pentru operația de inserare:

#[derivare (inserabil)]
#[table_name = "uman"]
structNewHuman<'A> {
Nume: &'Astr,
nume: &'Astr,
vârstă: i32,
}

Funcția dvs. de inserare va prelua o instanță de conexiune și datele pe care doriți să le introduceți în baza de date. Introduceți datele și imprimați un mesaj în funcție de starea operației.

fnIntrodu in<'A>(conexiune: &SqliteConnection, prenume: &'Astr, nume: &'Astr, varsta: i32) -> uman {
utilizare crate:: schema:: uman;

lăsa new_human = NewHuman {
Nume,
nume,
vârstă,
};

diesel:: insert_into (human:: table).values(&new_human).execute (conn).expect(„Eroare la inserarea unui nou om”);

uman:: table.order (uman:: id.desc()).first (conn).unwrap()
}

The Introdu in funcția preia parametrii și inserează valorile în baza de date cu Diesel Introdu in funcția care preia tabelul și valorile funcție care preia o instanță struct. Funcția atribuie ID-ul în ordine descrescătoare cu desc funcția înainte de a executa operația.

Iată principal funcția care apelează Introdu in funcţie:

fnprincipal() {
lăsa conn = stabilire_conexiune();
lăsa new_human = insert_into(&conn, "Ioan", "Căprioară", 25);
println!(„Omul nou introdus cu ID: {}”, new_human.id);

}

The conn variabila este o instanță de conexiune, iar nou_uman variabila este apelul funcției. The principal funcția imprimă ID-ul după o operațiune cu succes.

Interogarea bazelor de date cu Diesel

Alternativ, structura funcției de interogare va implementa Interogabil atribut cu a deriva macro.

Iată structura pentru operația de interogare:

// Definiți o structură care reprezintă un rând în tabelul dvs
#[derivare (interogabil)]
structUman {
id: i32,
Nume: Şir,
nume: Şir,
vârstă: i32,
}

Funcția de interogare va prelua o instanță de conexiune și va returna a Uman structura după cum urmează:

fnquery_db(conexiune: &SqliteConnection) -> Uman {
filtru.om (vârsta.echivalent(25)).first (conn).expect(„Eroare la interogarea bazei de date”)
}

The query_db funcția filtrează tabelul uman pentru rândul în care vârstă este egal cu 25 și returnează prima apariție ca o instanță struct.

fnprincipal() {

lăsa conn = stabilire_conexiune();
lăsa persoană = query_db(&conn);

println!(„ID: {}”, person.id);
println!("Nume: {}", persoana.prenume);
println!("Nume: {}", persoana.nume);
println!(„Vârsta: {}”, persoana.varsta);
}

În principal funcția, cea persoană variabila numește query_db funcția și imprimă câmpurile rândului cu o valoare de vârstă egală cu 25.

Puteți construi servere web cu Rust

Rust continuă să câștige popularitate în dezvoltarea web ca limbaj pe partea de server cu biblioteci precum Actix-web și Rachetă care facilitează configurarea serverelor și construirea de API-uri și site-uri web prin abstractizarea funcționalității complexe.

Majoritatea serverelor web trebuie să interacționeze cu bazele de date pentru stocarea și recuperarea datelor. Vă puteți integra în continuare aplicațiile diesel cu Actix-web sau Rocket pentru a crea aplicații web sofisticate.