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