Belajar Pengaturcaraan Rust · Pelajaran

Pertanyaan Disemak Semasa Kompilasi

SQL selamat jenis

Pelajaran 2 daripada 413 langkah

Pertanyaan Disemak Semasa Kompilasi ialah pelajaran Belajar Pengaturcaraan Rust percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Belajar Pengaturcaraan Rust, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Belajar Pengaturcaraan Rust merangkumi sejumlah 4 pelajaran.

Ciri utama

sqlx boleh mengesahkan SQL anda pada masa kompilasi berbanding skema pangkalan data sebenar. Kesilapan ejaan, nama lajur yang salah dan ketidakpadanan jenis akan menjadi ralat binaan.

  • Menggunakan keluarga makro query!
  • Mengesan pepijat sebelum masa jalan

query! berbanding query

Fungsi query() disemak pada masa jalan. Makro query! disemak pada masa kompilasi dengan menyambung ke pangkalan data semasa binaan.

use sqlx::{Pool, Postgres};

async fn run(pool: &Pool<Postgres>) {
    let rec = sqlx::query!("SELECT id, name FROM users WHERE id = $1", 1i32)
        .fetch_one(pool)
        .await
        .unwrap();
}

Medan hasil bertip

Makro query! menjana struct tanpa nama yang medannya sepadan dengan lajur terpilih, dengan jenis Rust yang betul disimpulkan daripada skema.

use sqlx::{Pool, Postgres};

async fn name_of(pool: &Pool<Postgres>, id: i32) -> String {
    let rec = sqlx::query!("SELECT name FROM users WHERE id = $1", id)
        .fetch_one(pool)
        .await
        .unwrap();
    rec.name
}

Cara semakan berfungsi

Pada masa binaan, sqlx memerlukan sama ada DATABASE_URL yang menghala kepada pangkalan data aktif atau direktori .sqlx yang dicache. Ia menghantar pertanyaan kepada pangkalan data untuk mengetahui jenis parameternya dan jenis hasilnya.

Mod luar talian dengan cargo sqlx prepare

Untuk CI tanpa pangkalan data, jalankan cargo sqlx prepare untuk menyimpan metadata pertanyaan ke dalam .sqlx/. Binaan kemudiannya menggunakan cache tersebut.

cargo sqlx prepare

query_as! ke dalam struct anda

Gunakan query_as! untuk memetakan baris terus ke dalam struct yang anda takrifkan, dengan semakan penuh masih dilakukan.

use sqlx::{Pool, Postgres};

struct User { id: i32, name: String }

async fn get(pool: &Pool<Postgres>) -> User {
    sqlx::query_as!(User, "SELECT id, name FROM users WHERE id = $1", 1i32)
        .fetch_one(pool)
        .await
        .unwrap()
}

Lajur boleh NULL menjadi Option

Jika sesuatu lajur mungkin NULL, sqlx menjadikan medannya sebagai Option. Anda boleh mengatasi inferens dengan anotasi jenis seperti name as "name!".

use sqlx::{Pool, Postgres};

async fn maybe_email(pool: &Pool<Postgres>) -> Option<String> {
    let rec = sqlx::query!("SELECT email FROM users WHERE id = $1", 1i32)
        .fetch_one(pool)
        .await
        .unwrap();
    rec.email
}

Memodelkan inferens jenis

Semakan masa kompilasi memetakan jenis SQL kepada jenis Rust. Contoh boleh dijalankan ini memodelkan keputusan pemetaan tersebut.

fn rust_type(sql: &str, nullable: bool) -> String {
    let base = match sql {
        "int4" => "i32",
        "text" => "String",
        "bool" => "bool",
        _ => "unknown",
    };
    if nullable { format!("Option<{}>", base) } else { base.to_string() }
}

fn main() {
    println!("{}", rust_type("int4", false));
    println!("{}", rust_type("text", true));
}

Ralat kompilasi yang akan anda lihat

Jika anda merujuk lajur yang tiada, sqlx akan menggagalkan binaan dengan mesej yang jelas. Keselamatan inilah tujuan utama makro tersebut.

  • Nama lajur salah → ralat pada masa kompilasi
  • Jenis tidak sepadan → ralat pada masa kompilasi

Parameter bind mengikut kedudukan

Gunakan ruang letak $1, $2 untuk Postgres. sqlx menyemak jenis setiap argumen yang diikat berbanding skema.

use sqlx::{Pool, Postgres};

async fn search(pool: &Pool<Postgres>, name: &str, min_age: i32) {
    let _ = sqlx::query!(
        "SELECT id FROM users WHERE name = $1 AND age >= $2",
        name, min_age
    ).fetch_all(pool).await.unwrap();
}

Bila menggunakan bentuk tanpa makro

Untuk SQL dinamik yang dibina pada masa jalan (apabila anda tidak mengetahui lajur lebih awal), gunakan query() / query_as(). Anda menukar semakan masa kompilasi dengan fleksibiliti.

use sqlx::{Pool, Postgres};

async fn dynamic(pool: &Pool<Postgres>, sql: &str) {
    let _ = sqlx::query(sql).execute(pool).await.unwrap();
}

Semakan pantas

Uji pemahaman anda tentang semakan masa kompilasi.

Rumusan

Anda telah mempelajari pertanyaan yang disemak pada masa kompilasi:

  • query! dan query_as! mengesahkan SQL berbanding skema pada masa binaan
  • Medan dan jenis hasil disimpulkan secara automatik
  • Lajur yang boleh NULL menjadi Option
  • cargo sqlx prepare membolehkan binaan luar talian
  • Gunakan query() tanpa makro untuk SQL dinamik

Seterusnya: operasi CRUD.

Percuma untuk bermula

Pelajari Rust dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
39
Pelajaran
144

Soalan Lazim

Adakah pelajaran “Pertanyaan Disemak Semasa Kompilasi” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Belajar Pengaturcaraan Rust, termasuk “Pertanyaan Disemak Semasa Kompilasi”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Belajar Pengaturcaraan Rust merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pertanyaan Disemak Semasa Kompilasi”?

SQL selamat jenis Anda berlatih Belajar Pengaturcaraan Rust menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Belajar Pengaturcaraan Rust?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Belajar Pengaturcaraan Rust di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Pertanyaan Disemak Semasa Kompilasi” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Belajar Pengaturcaraan Rust ini?

Ya. Setiap pelajaran Belajar Pengaturcaraan Rust menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Menyambung ke Pangkalan Data
  2. Pertanyaan Disemak Semasa Kompilasi
  3. Operasi CRUD
  4. Migrasi
← Kembali ke Belajar Pengaturcaraan Rust