Hier is een gids om u op weg te helpen met het gebruik van SQL-databases in Rust.

Naarmate u meer Rust-programma's bouwt, moet u mogelijk communiceren met databases voor het opslaan en ophalen van gegevens.

Rust's sterke typing, geheugenveiligheid en prestaties, gecombineerd met zijn ondersteuning voor asynchrone bewerkingen, ORM's en migraties, maken efficiënte en schaalbare gegevensverwerking mogelijk, waardoor Rust een uitstekende keuze is voor het bouwen van databases toepassingen.

Inleiding tot het gebruik van SQL-databases in Rust

Er zijn veel databasekratten en -bibliotheken in het Rust-ecosysteem die ondersteuning bieden voor de verschillende databaseparadigma's.

Voor SQL-databases kunt u kiezen tussen databasestuurprogramma's zoals Libpq, Mysql-connector, En Sqlite3 die een interface bieden voor Rust-programma's om rechtstreeks met databases te communiceren zonder enige abstractielaag op de SQL en ORM's (Object-Relational Mappers) zoals Diesel, Sqlx, En Roest-postgres die een handige manier bieden om met database over te werken Roest gegevenstypen zoals structuren en functies.

instagram viewer

De Diesel ORM is een van de meest populaire databasepakketten in het Rust-ecosysteem. Als een ORM biedt Diesel functies van het bouwen en uitvoeren van query's tot modeldefinitie en migraties van databaseschema's, waardoor het voor u gemakkelijker wordt om met databases te communiceren en schrijf efficiënte, schone en gemakkelijk te onderhouden code.

Diesel ondersteunt ook meerdere database-engines, waaronder PostgreSQL, MySQL en SQLite, en biedt een robuuste set functies voor het afhandelen van complexe databasebewerkingen zoals transacties, joins en aggregatiefuncties.

Met krachtige tools, functies en uitstekende documentatie is Diesel een favoriete keuze geworden voor veel Rust-ontwikkelaars die robuuste en schaalbare datagestuurde applicaties willen bouwen.

Aan de slag met Diesel

Je moet de toevoegen diesel En dotenv kratten naar de afhankelijkheden van uw project in het gedeelte afhankelijkheden van uw vracht.toml bestand.

[afhankelijkheden]
diesel = { versie = "1.4.4", kenmerken = ["sqlite"] }
dotenv = "0.15.0"

Nadat u de kratten als afhankelijkheden hebt toegevoegd, moet u het diesel_cli CLI-tool voor interactie met Diesel.

Voer deze opdracht uit om het diesel_cli hulpmiddel:

vrachtinstallatie diesel_cli

U kunt de CLI-tool aanroepen met de diesel commando na het installeren van de tool.

Maak vervolgens een bestand met omgevingsvariabelen en geef uw database-URL op.

Voer deze opdracht uit om de database-URL voor een in-memory SQLite-database te maken en in te voegen.

echo DATABASE_URL=database.db > .env

Om met Diesel te werken, moet u sqlite3 of uw voorkeursdatabase op uw computer installeren.

Voer ten slotte de opgericht opdracht voor Diesel om een ​​database voor uw project op te zetten:

diesel opstelling

De opgericht commando maakt een migraties directory, maakt de database aan die is opgegeven in de DATABASE_URL, en voert bestaande migraties uit.

Migraties opzetten met Diesel

Na het instellen van uw database met Diesel, gebruikt u de migratie genereren opdracht om migratiebestanden te genereren. Je voegt de naam van het bestand toe als argument:

dieselmigratie genereren create_humans

De opdracht genereert twee SQL-bestanden in het migraties map: up.sql En down.sql.

U schrijft SQL voor uw databasetabeldefinities in de up.sql bestand:

-- Uw SQL komt hier

CREËRENTAFEL"menselijk"
(
"id" INTEGER NIET NULL PRIMAIRE SLEUTEL AUTOINCREMENT,
"voornaam" TEKST NIET NULL,
"achternaam" TEKST NIET NULL,
"leeftijd" INTEGER NIET NULL
);

Je schrijft SQL-code om databasetabellen in de down.sql bestand:

-- down.sql

-- Dit bestand zou alles in `up.sql` ongedaan moeten maken
DRUPPELTAFEL"menselijk"

Voer na het schrijven van de SQL-bestanden het migratie uitgevoerd opdracht om lopende migraties toe te passen.

diesel migratie run

Daarnaast kunt u gebruik maken van de migratie opnieuw opdracht om migraties ongedaan te maken:

dieselmigratie opnieuw

Ook kunt u gebruik maken van de print-schema opdracht om het schema af te drukken. De opdracht drukt de inhoud van het schema.rs bestand.

diesel afdrukschema

De uitvoer van de print_schema commando is Rust-code die overeenkomt met uw SQL-schema:

Verbinding maken met uw SQL-database met Diesel

Voeg eerst deze invoer en richtlijnen toe aan uw bestand:

mod schema;

#[macrogebruik]
externkrat diesel;
gebruik dotenv:: dotenv;
gebruik diesel:: voorspel::*;
gebruik standaard:: env;
gebruik Diesel::{Connection, ExpressionMethods, QueryDsl, RunQueryDsl, SqliteConnection};
gebruik krat:: schema:: mens;

U gebruikt de invoer en richtlijnen om verbinding te maken met uw database en bewerkingen uit te voeren.

U kunt als volgt verbinding maken met een SQLite-database met een functie en een verbindingsinstantie retourneren:

gebruik standaard:: env;
gebruik diesel::{Verbinding, SqliteVerbinding};

fntot stand brengen_verbinding() -> SqliteVerbinding {
dotenv().ok();

laten database_url = env:: var("DATABASE_URL")
.verwachten("DATABASE_URL moet worden ingesteld");
SqliteConnection:: tot stand brengen(&database_url)
.uitpakken_of_anders(|_| paniek!("Fout bij verbinden met {}", database_url))
}

De tot stand brengen_verbinding functie retourneert de verbindingsinstantie struct (Sqlite-verbinding). De tot stand brengen_verbinding laadt de omgevingsvariabelen met de OK functie, benadert de database-URL met de var functie, en maakt een verbinding met de database via de URL met de vestigen functie.

Na een succesvolle verbinding kunt u query's uitvoeren en deze in uw database invoegen.

Waarden invoegen in een database met Diesel

U gebruikt een structuur die overeenkomt met uw SQL-schema om waarden in uw database in te voegen.

Hier is een structuur die overeenkomt met de menselijk tabel schema:

#[afleiden (opvraagbaar)]
kroegstructuurMenselijk {
kroeg ID kaart: i32,
kroeg Voornaam: Snaar,
kroeg achternaam: Snaar,
kroeg leeftijd: i32,
}

De invoegfunctie retourneert een instantie van de Menselijk typ voor andere bewerkingen.

Je hebt een structuur nodig voor je invoegfunctie; de struct zal twee macro-attributen implementeren, één voor invoegfunctionaliteit en de andere die de tabel voor de bewerking identificeert.

Hier is de structuur voor de invoegbewerking:

#[afleiden (invoegbaar)]
#[tabel_naam = "menselijk"]
structuurNieuweMens<'A> {
Voornaam: &'Astr,
achternaam: &'Astr,
leeftijd: i32,
}

Uw invoegfunctie neemt een verbindingsinstantie op en de gegevens die u in de database wilt invoegen. Voer de gegevens in en druk een bericht af op basis van de status van de bewerking.

fninvoegen_in<'A>(conn: &SqliteConnection, voornaam: &'Astr, achternaam: &'Astr, leeftijd: i32) -> Mens {
gebruik krat:: schema:: mens;

laten nieuwe_mens = Nieuwemens {
Voornaam,
achternaam,
leeftijd,
};

diesel:: insert_into (human:: table).values(&new_human).execute (conn).expect("Fout bij invoegen nieuw mens");

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

De invoegen_in functie neemt de parameters op en voegt de waarden in de database in met die van Diesel invoegen_in functie die de tabel en de waarden functie die een struct-instantie opneemt. De functie wijst de ID in aflopende volgorde toe met de ontschr functie voordat u de bewerking uitvoert.

Hier is de voornaamst functie die de aanroept invoegen_in functie:

fnvoornaamst() {
laten conn = verbinding maken();
laten new_human = invoegen_in(&conn, "John", "Doe", 25);
println!("Nieuwe mens ingevoegd met ID: {}", nieuwe_mens.id);

}

De verbind variabele is een verbindingsinstantie en de nieuwe_mens variabele is de functieaanroep. De voornaamst functie drukt de ID af na een succesvolle bewerking.

Databases opvragen met Diesel

Als alternatief zal uw queryfunctie struct de Bevraagbaar attribuut met een afleiden macro.

Dit is de structuur voor de querybewerking:

// Definieer een structuur die een rij in uw tabel vertegenwoordigt
#[afleiden (opvraagbaar)]
structuurMenselijk {
ID kaart: i32,
Voornaam: Snaar,
achternaam: Snaar,
leeftijd: i32,
}

De queryfunctie neemt een verbindingsinstantie op en retourneert een Menselijk struct als volgt:

fnvraag_db(conn: &SqliteConnection) -> Mens {
mens.filter (leeftijd.eq(25)).eerst (verbinden).verwachten("Fout bij het opvragen van database")
}

De vraag_db functie filtert de menselijke tabel voor de rij waar de leeftijd is gelijk aan 25 en retourneert de eerste instantie als een struct-instantie.

fnvoornaamst() {

laten conn = verbinding maken();
laten persoon = query_db(&conn);

println!("ID KAART: {}", persoon.id);
println!("Voornaam: {}", persoon.voornaam);
println!("Achternaam: {}", persoon.achternaam);
println!("Leeftijd: {}", persoon.leeftijd);
}

In de voornaamst functie, de persoon variabele roept de vraag_db functie en drukt de velden van de rij af met een leeftijdswaarde gelijk aan 25.

U kunt webservers bouwen met roest

Rust blijft aan populariteit winnen in webontwikkeling als een server-side taal met bibliotheken zoals Actix-web En Raket die het eenvoudiger maken om servers op te zetten en API's en websites te bouwen door complexe functionaliteit te abstraheren.

De meeste webservers moeten communiceren met databases voor het opslaan en ophalen van gegevens. U kunt uw door Diesel aangedreven apps verder integreren met Actix-web of Rocket om geavanceerde webapplicaties te bouwen.