0Pricing
Go Academy · บทเรียน

คำสั่งที่เตรียมไว้

เรียกใช้คำสั่งสอบถามแบบกำหนดพารามิเตอร์

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

คำสั่งที่เตรียมไว้คืออะไร

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

ตัวยึดตำแหน่งพารามิเตอร์

อย่าสร้าง SQL ด้วยการต่อข้อมูลที่ผู้ใช้ป้อนเข้าด้วยกัน ให้ใช้ตัวยึดตำแหน่งเพื่อให้ไดรเวอร์ส่งค่าแยกจากกัน PostgreSQL ใช้ $1, $2 ส่วน MySQL และ SQLite ใช้ ?

SELECT * FROM users WHERE age > $1 AND city = $2

เหตุใดจึงหยุดการแทรกคำสั่งได้

เนื่องจากพารามิเตอร์เดินทางแยกจากข้อความ SQL ฐานข้อมูลจึงปฏิบัติต่อพารามิเตอร์เหล่านั้นเป็นข้อมูลเท่านั้น ไม่เคยปฏิบัติเป็นโค้ด ค่าที่เป็นอันตรายอย่าง " OR 1=1 จึงกลายเป็นสตริงค่าตามตัวอักษร ไม่ใช่ SQL ที่เรียกใช้งานได้

db.Prepare

Prepare ส่งคืน *sql.Stmt ที่ผูกกับพูล จากนั้นคุณเรียก Exec หรือ Query บนคำสั่งนั้นพร้อมอาร์กิวเมนต์

stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES($1, $2)")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close()

การเรียกใช้คำสั่ง

เรียก stmt.Exec พร้อมอาร์กิวเมนต์สำหรับตัวยึดตำแหน่งแต่ละตัว สำหรับการเพิ่มและปรับปรุงข้อมูล Exec จะส่งคืน sql.Result ซึ่งมีจำนวนแถวที่ได้รับผลกระทบและรหัสการเพิ่มข้อมูลล่าสุด

res, err := stmt.Exec("Ada", 36)
if err != nil {
    log.Fatal(err)
}
n, _ := res.RowsAffected()
fmt.Println("inserted", n)

การนำกลับมาใช้ในลูป

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

for _, u := range users {
    if _, err := stmt.Exec(u.Name, u.Age); err != nil {
        log.Fatal(err)
    }
}

การเตรียมโดยปริยาย

การส่งอาร์กิวเมนต์ให้ db.Query หรือ db.Exec โดยตรงก็ใช้ตัวยึดตำแหน่งอย่างปลอดภัยเช่นกัน ไดรเวอร์อาจเตรียมคำสั่งให้เบื้องหลัง การเรียก Prepare อย่างชัดเจนมีความสำคัญเป็นหลักเมื่อมีการเรียกใช้ซ้ำหลายครั้ง

การจำลองการผูกพารามิเตอร์ที่เรียกใช้งานได้

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

package main

import "fmt"

func execPrepared(query string, args ...interface{}) string {
    return fmt.Sprintf("EXEC %q with args %v", query, args)
}

func main() {
    q := "INSERT INTO users(name, age) VALUES($1, $2)"
    people := [][2]interface{}{{"Ada", 36}, {"Lin", 41}}
    for _, p := range people {
        fmt.Println(execPrepared(q, p[0], p[1]))
    }
}

รูปแบบของบริบท

ใช้ PrepareContext และ stmt.ExecContext เพื่อให้การเรียกใช้คำสั่งที่เตรียมไว้เคารพการหมดเวลาและการยกเลิก เช่นเดียวกับส่วนอื่นของแพ็กเกจสำหรับฐานข้อมูล

ปิด Stmt เสมอ

*sql.Stmt ใช้ทรัพยากรในฐานข้อมูล เมื่อใช้งานเสร็จแล้วให้เลื่อนการทำงานของ stmt.Close() ออกไป การรั่วไหลของคำสั่งอาจทำให้จำนวนคำสั่งที่เตรียมไว้ฝั่งเซิร์ฟเวอร์เต็มขีดจำกัด

คำสั่งและการจัดการกลุ่มการเชื่อมต่อ

คำสั่งที่เตรียมไว้บน *sql.DB ทำงานได้กับการเชื่อมต่อในกลุ่มทั้งหมด ไลบรารีจะเตรียมคำสั่งนั้นใหม่บนการเชื่อมต่อใดก็ตามที่คำสั่งถูกส่งไป โดยปกติแล้วไม่จำเป็นต้องจัดการเรื่องนี้ด้วยตนเอง

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความรู้เกี่ยวกับคำสั่งที่เตรียมไว้

สรุปทบทวน

คุณได้เรียนรู้เกี่ยวกับคำสั่งที่เตรียมไว้ดังนี้:

  • Prepare แยกวิเคราะห์ครั้งเดียว แล้วเรียกใช้งานได้หลายครั้ง
  • ตัวแทนตำแหน่ง ($1 หรือ ?) ทำให้ค่าเป็นข้อมูลแยกต่างหากและป้องกันการแทรกคำสั่ง
  • stmt.Exec ส่งคืนจำนวนแถวที่ได้รับผลกระทบ และควรใช้การเลื่อนการทำงานของ stmt.Close()
  • นำกลับมาใช้ใหม่ในลูป และใช้รูปแบบของ Context สำหรับกำหนดเวลาสิ้นสุด

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

บทเรียน “คำสั่งที่เตรียมไว้” ฟรีหรือไม่

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

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

เรียกใช้คำสั่งสอบถามแบบกำหนดพารามิเตอร์ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “คำสั่งที่เตรียมไว้” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การเปิดการเชื่อมต่อ
  2. การสอบถามแถวข้อมูล
  3. คำสั่งที่เตรียมไว้
  4. ธุรกรรม
← กลับไปที่ Go Academy