Oto przewodnik, który pomoże Ci rozpocząć korzystanie z baz danych SQL w Rust.

Gdy tworzysz więcej programów Rusta, możesz potrzebować interakcji z bazami danych w celu przechowywania i wyszukiwania danych.

Silne pisanie, bezpieczeństwo pamięci i wydajność Rust w połączeniu z obsługą operacji asynchronicznych, ORM i migracje, umożliwiają wydajne i skalowalne przetwarzanie danych, dzięki czemu Rust jest doskonałym wyborem do budowania baz danych Aplikacje.

Wprowadzenie do korzystania z baz danych SQL w Rust

Istnieje wiele baz danych i bibliotek w ekosystemie Rust, które zapewniają wsparcie dla różnych paradygmatów baz danych.

W przypadku baz danych SQL możesz wybierać między sterownikami baz danych, takimi jak Libpq, Łącznik Mysql, I sqlite3 które zapewniają interfejs dla programów Rust do bezpośredniej interakcji z bazami danych bez żadnej warstwy abstrakcji w SQL i ORM (Mappery obiektowo-relacyjne), takie jak Diesel, sqlx, I Rust-postgres które zapewniają wygodny sposób pracy z bazą danych Typy danych Rusta jak struktury i funkcje.

instagram viewer

Diesel ORM to jeden z najpopularniejszych pakietów baz danych w ekosystemie Rust. Jako ORM Diesel zapewnia funkcje od tworzenia i wykonywania zapytań po definiowanie modeli i migracje schematów baz danych, ułatwiając interakcję z bazami danych i pisać wydajny, czysty i łatwy w utrzymaniu kod.

Diesel również obsługuje wiele silników baz danych, w tym PostgreSQL, MySQL i SQLitei zapewnia solidny zestaw funkcji do obsługi złożonych operacji na bazie danych, takich jak transakcje, łączenia i funkcje agregujące.

Dzięki potężnym narzędziom, funkcjom i doskonałej dokumentacji Diesel stał się podstawowym wyborem dla wielu programistów Rusta, którzy chcą tworzyć solidne i skalowalne aplikacje oparte na danych.

Pierwsze kroki z olejem napędowym

Będziesz musiał dodać diesel I dotenv crates do zależności twojego projektu w sekcji zależności twojego ładunek.toml plik.

[zależności]
diesel = { wersja = "1.4.4", funkcje = ["kwadratowy"] }
dotenv = "0.15.0"

Po dodaniu skrzynek jako zależności należy zainstalować plik diesel_cli Narzędzie CLI do interakcji z Diesel.

Uruchom to polecenie, aby zainstalować diesel_cli narzędzie:

ładunek zainstaluj diesel_cli

Możesz wywołać narzędzie CLI za pomocą diesel polecenie po zainstalowaniu narzędzia.

Następnie utwórz plik zmiennych środowiskowych i określ adres URL bazy danych.

Uruchom to polecenie, aby utworzyć i wstawić adres URL bazy danych dla bazy danych SQLite w pamięci.

echo DATABASE_URL=baza danych.db > .env

Aby pracować z Diesel, musisz zainstalować sqlite3 lub preferowaną bazę danych na swoim komputerze.

Na koniec uruchom organizować coś polecenie, aby Diesel utworzył bazę danych dla twojego projektu:

konfiguracja diesla

The organizować coś polecenie tworzy a migracje katalog, tworzy bazę danych określoną w pliku BAZA DANYCH_URLi uruchamia istniejące migracje.

Konfigurowanie migracji z silnikiem Diesla

Po skonfigurowaniu bazy danych w Diesel użyjesz pliku generować migrację polecenie do generowania plików migracji. Dodasz nazwę pliku jako argument:

migracja diesla generuje create_humans

Polecenie generuje dwa pliki SQL w formacie migracje informator: up.sql I down.sql.

Będziesz pisać SQL dla definicji tabel bazy danych w pliku up.sql plik:

-- Twój SQL idzie tutaj

TWORZYĆTABELA"człowiek"
(
„id” INTEGER NOT NULL AUTOINKREMENT KLUCZA PODSTAWOWEGO,
TEKST „imię” NIE NULL,
TEKST „nazwisko” NIE NULL,
„wiek” INTEGER NIE NULL
);

Napiszesz kod SQL, aby upuścić tabele bazy danych w pliku down.sql plik:

-- down.sql

-- Ten plik powinien cofnąć wszystko w `up.sql`
UPUSZCZAĆTABELA"człowiek"

Po zapisaniu plików SQL uruchom plik bieg migracji polecenie zastosowania oczekujących migracji.

przebieg migracji oleju napędowego

Dodatkowo możesz skorzystać z tzw ponowna migracja polecenie cofnięcia migracji:

ponowna migracja oleju napędowego

Możesz także użyć tzw schemat wydruku polecenie wydrukowania schematu. Polecenie drukuje zawartość pliku schemat.rs plik.

schemat wydruku diesla

Wyjście schemat_drukowania polecenie to kod Rust, który pasuje do twojego schematu SQL:

Łączenie się z Twoją bazą danych SQL za pomocą Diesel

Najpierw dodaj te importy i dyrektywy do swojego pliku:

mod schemat;

#[macro_use]
zewnętrznyskrzynia diesel;
używać dotenv:: dotenv;
używać olej napędowy:: preludium::*;
używać std:: env;
używać Diesel::{Connection, ExpressionMethods, QueryDsl, RunQueryDsl, SqliteConnection};
używać skrzynia:: schemat:: człowiek;

Będziesz używać importu i dyrektyw do łączenia się z bazą danych i wykonywania operacji.

Oto jak możesz połączyć się z bazą danych SQLite za pomocą funkcji i zwrócić instancję połączenia:

używać std:: env;
używać olej napędowy::{Połączenie, SqliteConnection};

przypustanowić_połączenie() -> SqliteConnection {
dotenv().ok();

pozwalać URL_bazy danych = env:: var(„URL_BAZY DANYCH”)
.oczekiwać(„DATABASE_URL musi być ustawiony”);
SqliteConnection:: ustanowienie (&database_url)
.unwrap_or_else(|_| panika!(„Błąd podczas łączenia z {}”, adres_adresu_bazy_danych))
}

The ustanowić_połączenie funkcja zwraca strukturę instancji połączenia (SqliteConnection). The ustanowić_połączenie ładuje zmienne środowiskowe z rozszerzeniem OK funkcja, uzyskuje dostęp do adresu URL bazy danych z rozszerzeniem rozm funkcji i nawiązuje połączenie z bazą danych poprzez adres URL z rozszerzeniem tworzyć funkcjonować.

Po udanym połączeniu możesz wykonywać zapytania i wstawiać je do swojej bazy danych.

Wstawianie wartości do bazy danych za pomocą Diesel

Użyjesz struktury, która pasuje do Twojego schematu SQL, aby wstawić wartości do bazy danych.

Oto struktura pasująca do człowiek schemat tabeli:

#[pochodna (możliwość zapytania)]
pubstrukturaCzłowiek {
pub ID: i32,
pub imię: Strunowy,
pub nazwisko: Strunowy,
pub wiek: i32,
}

Funkcja wstawiania zwróci instancję Człowiek typ dla innych operacji.

Będziesz potrzebować struktury dla swojej funkcji wstawiania; struktura zaimplementuje dwa atrybuty makro, jeden dla funkcji wstawiania, a drugi, który identyfikuje tabelę dla operacji.

Oto struktura operacji wstawiania:

#[pochodna (wstawiana)]
#[nazwa_tabeli = "człowiek"]
strukturaNowy Człowiek<'A> {
imię: &'Aul,
nazwisko: &'Aul,
wiek: i32,
}

Twoja funkcja wstawiania przyjmie instancję połączenia i dane, które chcesz wstawić do bazy danych. Wprowadź dane i wydrukuj komunikat na podstawie stanu operacji.

przypwłóż w<'A>(połączenie: &SqliteConnection, imię: &'Aul, nazwisko: &'Aul, wiek: i32) -> Człowiek {
używać skrzynia:: schemat:: człowiek;

pozwalać nowy_człowiek = Nowy człowiek {
imię,
nazwisko,
wiek,
};

diesel:: insert_into (człowiek:: tabela).values(&new_human).execute (conn).expect(„Błąd podczas wstawiania nowego człowieka”);

człowiek:: table.order (człowiek:: id.desc()).first (conn).unwrap()
}

The włóż w funkcja pobiera parametry i wstawia wartości do bazy danych z danymi Diesela włóż w funkcja, która przyjmuje tabelę i wartości funkcja, która przyjmuje instancję struktury. Funkcja przypisuje identyfikator w porządku malejącym z opis funkcję przed wykonaniem operacji.

Tutaj jest główny funkcja wywołująca tzw włóż w funkcjonować:

przypgłówny() {
pozwalać conn = ustanowienie_połączenia();
pozwalać nowy_człowiek = wstaw_do(&połącz, "Jan", "Łania", 25);
drukuj!(„Wstawiono nowego człowieka o identyfikatorze: {}”, nowy_człowiek.id);

}

The połączenie zmienna jest instancją połączenia, a nowy_człowiek zmienna to wywołanie funkcji. The główny funkcja drukuje identyfikator po udanej operacji.

Wyszukiwanie baz danych za pomocą Diesel

Alternatywnie struktura funkcji zapytania zaimplementuje metodę Zapytanie atrybut z a czerpać makro.

Oto struktura operacji zapytania:

// Zdefiniuj strukturę reprezentującą wiersz w tabeli
#[pochodna (możliwość zapytania)]
strukturaCzłowiek {
ID: i32,
imię: Strunowy,
nazwisko: Strunowy,
wiek: i32,
}

Funkcja zapytania przyjmie instancję połączenia i zwróci a Człowiek skonstruować w następujący sposób:

przypbaza danych_zapytań(połączenie: &SqliteConnection) -> Człowiek {
człowiek.filtr (wiek.eq(25)).first (conn).expect(„Błąd zapytania do bazy danych”)
}

The baza danych_zapytań funkcja filtruje tabelę ludzką dla wiersza, w którym wiek równa się 25 i zwraca pierwsze wystąpienie jako instancję struktury.

przypgłówny() {

pozwalać conn = ustanowienie_połączenia();
pozwalać osoba = baza danych zapytania (&połączenie);

drukuj!("ID: {}", osoba.id);
drukuj!("Imię: {}", osoba.imię);
drukuj!("Nazwisko: {}", osoba.nazwisko);
drukuj!("Wiek: {}", osoba.wiek);
}

w główny funkcja, tzw osoba zmienna wywołuje baza danych_zapytań funkcja i drukuje pola wiersza z wartością wieku równą 25.

Możesz zbudować serwery sieciowe za pomocą Rusta

Rust nadal zyskuje popularność w tworzeniu stron internetowych jako język po stronie serwera z bibliotekami takimi jak Actix-web I Rakieta które ułatwiają konfigurowanie serwerów oraz tworzenie interfejsów API i stron internetowych poprzez abstrakcję złożonych funkcji.

Większość serwerów WWW musi współdziałać z bazami danych w celu przechowywania i wyszukiwania danych. Możesz dalej integrować swoje aplikacje napędzane silnikiem Diesla z Actix-web lub Rocket, aby tworzyć zaawansowane aplikacje internetowe.