Learn Rust Coding · บทเรียน

คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์

SQL ที่ปลอดภัยด้านชนิดข้อมูล

บทเรียน 2 จาก 413 ขั้นตอน

คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์ เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณสมบัติเด่น

sqlx สามารถตรวจสอบ SQL ของคุณขณะคอมไพล์โดยเทียบกับโครงสร้างฐานข้อมูลจริง การพิมพ์ผิด ชื่อคอลัมน์ไม่ถูกต้อง และชนิดข้อมูลไม่ตรงกันจะกลายเป็นข้อผิดพลาดขณะสร้างโปรแกรม

  • ใช้มาโครตระกูล query!
  • ตรวจพบข้อผิดพลาดก่อนรันโปรแกรม

query! เทียบกับ query

ฟังก์ชัน query() จะถูกตรวจสอบขณะรันโปรแกรม ส่วนมาโคร query! จะถูกตรวจสอบขณะคอมไพล์โดยเชื่อมต่อฐานข้อมูลระหว่างการสร้างโปรแกรม

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();
}

ฟิลด์ผลลัพธ์ที่มีชนิดข้อมูล

มาโคร query! จะสร้างโครงสร้างนิรนามที่มีฟิลด์ตรงกับคอลัมน์ที่เลือก พร้อมอนุมานชนิดข้อมูล Rust ที่ถูกต้องจากโครงสร้างฐานข้อมูล

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
}

การตรวจสอบทำงานอย่างไร

ขณะสร้างโปรแกรม sqlx ต้องมี DATABASE_URL ที่ใช้งานได้จริง หรือไดเรกทอรี .sqlx ที่เก็บแคชไว้ โดยจะส่งคำสั่งค้นหาไปยังฐานข้อมูลเพื่อเรียนรู้ชนิดของพารามิเตอร์และผลลัพธ์

โหมดออฟไลน์ด้วย cargo sqlx prepare

สำหรับ CI ที่ไม่มีฐานข้อมูล ให้เรียก cargo sqlx prepare เพื่อบันทึกข้อมูลเมทาดาทาของคำสั่งค้นหาไว้ใน .sqlx/ จากนั้นการสร้างโปรแกรมจะใช้แคชนี้

cargo sqlx prepare

query_as! ลงในโครงสร้างของคุณ

ใช้ query_as! เพื่อแมปแถวลงในโครงสร้างที่คุณกำหนดโดยตรง โดยยังคงตรวจสอบอย่างครบถ้วน

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()
}

คอลัมน์ที่เป็นค่าว่างจะกลายเป็น Option

หากคอลัมน์อาจมีค่า NULL sqlx จะทำให้ฟิลด์นั้นเป็น Option คุณสามารถกำหนดการอนุมานเองด้วยคำอธิบายชนิดข้อมูล เช่น 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
}

การจำลองการอนุมานชนิดข้อมูล

การตรวจสอบขณะคอมไพล์จะแมปชนิดข้อมูล SQL ไปเป็นชนิดข้อมูล Rust ตัวอย่างที่รันได้นี้จำลองการตัดสินใจในการแมปดังกล่าว

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));
}

ข้อผิดพลาดขณะคอมไพล์ที่คุณจะพบ

หากคุณอ้างอิงคอลัมน์ที่ไม่มีอยู่ sqlx จะทำให้การสร้างโปรแกรมล้มเหลวพร้อมข้อความที่ชัดเจน ความปลอดภัยนี้คือเหตุผลหลักของการใช้มาโคร

  • ชื่อคอลัมน์ไม่ถูกต้อง → ข้อผิดพลาดขณะคอมไพล์
  • ชนิดข้อมูลไม่ตรงกัน → ข้อผิดพลาดขณะคอมไพล์

พารามิเตอร์ที่ผูกไว้ใช้ตำแหน่งเป็นตัวกำหนด

ใช้ตัวแทน $1, $2 สำหรับ Postgres sqlx จะตรวจสอบชนิดของอาร์กิวเมนต์ที่ผูกไว้แต่ละตัวกับโครงสร้างฐานข้อมูล

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();
}

ควรใช้รูปแบบที่ไม่ใช่มาโครเมื่อใด

สำหรับ SQL แบบไดนามิกที่สร้างขณะรันโปรแกรม (เมื่อคุณไม่ทราบคอลัมน์ล่วงหน้า) ให้ใช้ query() / query_as() คุณจะแลกการตรวจสอบขณะคอมไพล์กับความยืดหยุ่น

use sqlx::{Pool, Postgres};

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

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับการตรวจสอบขณะคอมไพล์

สรุปทบทวน

คุณได้เรียนรู้คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์:

  • query! และ query_as! ตรวจสอบ SQL กับโครงสร้างฐานข้อมูลขณะสร้างโปรแกรม
  • ฟิลด์และชนิดข้อมูลของผลลัพธ์จะถูกอนุมานโดยอัตโนมัติ
  • คอลัมน์ที่เป็นค่าว่างจะกลายเป็น Option
  • cargo sqlx prepare ทำให้สร้างโปรแกรมแบบออฟไลน์ได้
  • ใช้ query() ที่ไม่ใช่มาโครสำหรับ SQL แบบไดนามิก

ถัดไป: การดำเนินการ CRUD

เริ่มต้นได้ฟรี

เรียนรู้ Rust ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
144

คำถามที่พบบ่อย

บทเรียน “คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์”

SQL ที่ปลอดภัยด้านชนิดข้อมูล คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเชื่อมต่อฐานข้อมูล
  2. คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์
  3. การดำเนินการ CRUD
  4. การย้ายโครงสร้างฐานข้อมูล
← กลับไปที่ Learn Rust Coding