คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์
SQL ที่ปลอดภัยด้านชนิดข้อมูล
คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์ เป็นบทเรียน 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 preparequery_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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเชื่อมต่อฐานข้อมูล
- คำสั่งค้นหาที่ตรวจสอบขณะคอมไพล์
- การดำเนินการ CRUD
- การย้ายโครงสร้างฐานข้อมูล