Farih.co.id
Home Programming Bekerja Dengan Database SQL di Rust

Bekerja Dengan Database SQL di Rust

rust foundation 2

Saat Anda membangun lebih banyak program Rust, Anda mungkin perlu berinteraksi dengan database untuk penyimpanan dan pengambilan data.


Pengetikan Rust yang kuat, keamanan memori, dan kinerja, dikombinasikan dengan dukungannya untuk operasi asinkron, ORM, dan migrasi, memungkinkan pemrosesan data yang efisien dan dapat diskalakan, menjadikan Rust pilihan yang sangat baik untuk membangun aplikasi basis data.


Pengantar Menggunakan Database SQL di Rust

Ada banyak peti database dan perpustakaan di ekosistem Rust yang menyediakan dukungan untuk berbagai paradigma database.

Untuk database SQL, Anda dapat memilih antara driver database seperti Libpq, Konektor MySQLDan sqlite3 yang menyediakan antarmuka untuk program Rust untuk berinteraksi dengan database secara langsung tanpa lapisan abstraksi apa pun pada SQL dan ORM (Object-Relational Mappers) seperti Diesel, SqlxDan Rust-postgres yang menyediakan cara mudah untuk bekerja dengan database melalui tipe data Rust seperti struct dan function.

ORM Diesel adalah salah satu paket database paling populer di ekosistem Rust. Sebagai ORM, Diesel menyediakan fitur mulai dari pembuatan kueri dan eksekusi hingga definisi model dan migrasi skema database, memudahkan Anda berinteraksi dengan database dan menulis kode yang efisien, bersih, dan mudah dipelihara.

Diesel juga mendukung beberapa mesin database termasuk PostgreSQL, MySQL, dan SQLite, dan menyediakan serangkaian fitur yang kuat untuk menangani operasi database yang kompleks seperti transaksi, penggabungan, dan fungsi agregat.

Dengan alat canggih, fitur, dan dokumentasi yang sangat baik, Diesel telah menjadi pilihan utama bagi banyak pengembang Rust yang ingin membangun aplikasi berbasis data yang tangguh dan dapat diskalakan.

Memulai Dengan Diesel

Anda harus menambahkan diesel Dan dotenv peti ke dependensi proyek Anda di bagian dependensi Anda cargo.toml mengajukan.

 [dependencies]
diesel = { version = "1.4.4", features = ["sqlite"] }
dotenv = "0.15.0"

Setelah menambahkan peti sebagai dependensi, Anda harus menginstal diesel_cli Alat CLI untuk berinteraksi dengan Diesel.

Jalankan perintah ini untuk menginstal diesel_cli alat:

 cargo install diesel_cli

Anda dapat memanggil alat CLI dengan diesel perintah setelah menginstal alat.

Selanjutnya, buat file variabel lingkungan dan tentukan URL database Anda.

Jalankan perintah ini untuk membuat dan menyisipkan URL database untuk database SQLite dalam memori.

 echo DATABASE_URL=database.db > .env

Untuk bekerja dengan Diesel, Anda harus menginstal sqlite3 atau database pilihan Anda di komputer Anda.

Terakhir, jalankan mempersiapkan perintah untuk Diesel untuk mengatur database untuk proyek Anda:

 diesel setup

Itu mempersiapkan perintah menciptakan a migrasi direktori, membuat database yang ditentukan dalam DATABASE_URLdan menjalankan migrasi yang ada.

Menyiapkan Migrasi Dengan Diesel

Setelah mengatur database Anda dengan Diesel, Anda akan menggunakan migrasi menghasilkan perintah untuk menghasilkan file migrasi. Anda akan menambahkan nama file sebagai argumen:

 diesel migration generate create_humans

Perintah menghasilkan dua file SQL di migrasi direktori: up.sql Dan down.sql.

Anda akan menulis SQL untuk definisi tabel database Anda di up.sql mengajukan:

 

CREATE TABLE "human"
(
    "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "first_name" TEXT NOT NULL,
    "last_name" TEXT NOT NULL,
    "age" INTEGER NOT NULL
);

Anda akan menulis kode SQL untuk menghapus tabel database di down.sql mengajukan:

 


DROP TABLE "human"

Setelah menulis file SQL, jalankan migrasi berjalan perintah untuk menerapkan migrasi yang tertunda.

 diesel migration run

Selain itu, Anda dapat menggunakan ulang migrasi perintah untuk mengembalikan migrasi:

 diesel migration redo

Juga, Anda dapat menggunakan cetak-skema perintah untuk mencetak skema. Perintah mencetak isi dari schema.rs mengajukan.

 diesel print-schema

Keluaran dari skema_cetak perintah adalah kode Rust yang cocok dengan skema SQL Anda:

hasil pencetakan skema

Menghubungkan ke Database SQL Anda Dengan Diesel

Pertama, tambahkan impor dan arahan ini ke file Anda:

 mod schema;

#[macro_use]
extern crate diesel;
use dotenv::dotenv;
use diesel::prelude::*;
use std::env;
use Diesel::{Connection, ExpressionMethods, QueryDsl, RunQueryDsl, SqliteConnection};
use crate::schema::human;

Anda akan menggunakan impor dan arahan untuk terhubung ke database Anda dan melakukan operasi.

Inilah cara Anda dapat terhubung ke database SQLite dengan fungsi dan mengembalikan instance koneksi:

 use std::env;
use diesel::{Connection, SqliteConnection};

fn establish_connection() -> SqliteConnection {
    dotenv().ok();

    let database_url = env::var("DATABASE_URL")
        .expect("DATABASE_URL must be set");
    SqliteConnection::establish(&database_url)
        .unwrap_or_else(|_| panic!("Error connecting to {}", database_url))
}

Itu membangun_koneksi fungsi mengembalikan instance koneksi struct (Koneksi SQLite). Itu membangun_koneksi memuat variabel lingkungan dengan Oke fungsi, mengakses URL database dengan var fungsi, dan membuat koneksi dengan database melalui URL dengan mendirikan fungsi.

Setelah koneksi berhasil, Anda dapat menjalankan kueri dan memasukkannya ke dalam database Anda.

Memasukkan Nilai ke Database Dengan Diesel

Anda akan menggunakan struct yang cocok dengan skema SQL Anda untuk memasukkan nilai ke dalam database Anda.

Inilah struct yang cocok dengan manusia skema tabel:

 #[derive(Queryable)]
pub struct Human {
    pub id: i32,
    pub first_name: String,
    pub last_name: String,
    pub age: i32,
}

Fungsi penyisipan akan mengembalikan turunan dari Manusia tipe untuk operasi lainnya.

Anda memerlukan struct untuk fungsi penyisipan Anda; struct akan mengimplementasikan dua atribut makro, satu untuk fungsi penyisipan dan yang lainnya mengidentifikasi tabel untuk operasi.

Inilah struct untuk operasi penyisipan:

 #[derive(Insertable)]
#[table_name = "human"]
struct NewHuman<'a> {
    first_name: &'a str,
    last_name: &'a str,
    age: i32,
}

Fungsi penyisipan Anda akan mengambil contoh koneksi dan data yang ingin Anda masukkan ke dalam database. Masukkan data dan cetak pesan berdasarkan status operasi.

 fn insert_into<'a>(conn: &SqliteConnection, first_name: &'a str, last_name: &'a str, age: i32) -> Human {
    use crate::schema::human;

    let new_human = NewHuman {
        first_name,
        last_name,
        age,
    };

    diesel::insert_into(human::table).values(&new_human).execute(conn).expect("Error inserting new human");

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

Itu Masukkan ke dalam fungsi mengambil parameter dan memasukkan nilai ke dalam database dengan Diesel Masukkan ke dalam fungsi yang mengambil dalam tabel dan nilai-nilai fungsi yang mengambil contoh struct. Fungsi menetapkan ID dalam urutan menurun dengan deskripsi fungsi sebelum menjalankan operasi.

Ini dia utama fungsi yang memanggil Masukkan ke dalam fungsi:

 fn main() {
    let conn = establish_connection();
    let new_human = insert_into(&conn, "John", "Doe", 25);
    println!("New human inserted with ID: {}", new_human.id);
    
}

Itu samb variabel adalah contoh koneksi, dan manusia_baru variabel adalah pemanggilan fungsi. Itu utama function mencetak ID setelah operasi berhasil.

hasil dari operasi penyisipan database

Menanyakan Database Dengan Diesel

Alternatifnya, struct fungsi kueri Anda akan mengimplementasikan Dapat ditanyakan atribut dengan a memperoleh makro.

Inilah struct untuk operasi kueri:

 
#[derive(Queryable)]
struct Human {
    id: i32,
    first_name: String,
    last_name: String,
    age: i32,
}

Fungsi kueri akan mengambil contoh koneksi dan mengembalikan a Manusia struktur sebagai berikut:

 fn query_db(conn: &SqliteConnection) -> Human {
    human.filter(age.eq(25)).first(conn).expect("Error querying database")
}

Itu kueri_db fungsi memfilter tabel manusia untuk baris tempat usia sama dengan 25 dan mengembalikan kejadian pertama sebagai instance struct.

 fn main() {

    let conn = establish_connection();
    let person = query_db(&conn);

    println!("ID: {}", person.id);
    println!("First Name: {}", person.first_name);
    println!("Last Name: {}", person.last_name);
    println!("Age: {}", person.age);
}

Dalam utama fungsi, yang orang variabel memanggil kueri_db fungsi dan mencetak bidang baris dengan nilai usia sama dengan 25.

Anda Dapat Membangun Server Web Dengan Rust

Rust terus mendapatkan popularitas dalam pengembangan web sebagai bahasa sisi server dengan perpustakaan seperti Actix-web Dan Roket yang membuatnya lebih mudah untuk mengatur server dan membangun API dan situs web dengan mengabstraksi fungsionalitas kompleks.

Sebagian besar server web harus berinteraksi dengan database untuk penyimpanan dan pengambilan data. Anda selanjutnya dapat mengintegrasikan aplikasi bertenaga Diesel Anda dengan Actix-web atau Rocket untuk membangun aplikasi web yang canggih.

Comment
Share:

Leave a Reply

Your email address will not be published. Required fields are marked *

Ad