การสอบถามแถวข้อมูล
อ่านชุดผลลัพธ์
การสอบถามแถวข้อมูล เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
การสอบถามชุดผลลัพธ์
ใช้ Query กับคำสั่งที่ส่งคืนแถว เช่น SELECT โดยจะส่งคืน *sql.Rows ให้คุณวนอ่าน สำหรับค่ารายการเดียว การใช้ QueryRow จะง่ายกว่า
db.Query
Query ส่ง SQL และส่งคืนแถวพร้อมข้อผิดพลาด ให้ตรวจสอบข้อผิดพลาดก่อนใช้แถวเหล่านั้นเสมอ
rows, err := db.Query("SELECT id, name FROM users WHERE active = $1", true)
if err != nil {
log.Fatal(err)
}ใช้ rows.Close() ใน defer เสมอ
แถวจะถือการเชื่อมต่อฐานข้อมูลไว้จนกว่าจะถูกปิด defer rows.Close() จะคืนการเชื่อมต่อนั้นกลับสู่พูล หากลืมทำเช่นนี้ การเชื่อมต่อจะรั่วไหลเมื่อมีภาระงานสูง
defer rows.Close()การวนอ่านด้วย rows.Next
rows.Next() เลื่อนไปยังแถวถัดไปและส่งคืนค่า false เมื่อหมดแถว ภายในลูปให้เรียก Scan เพื่อคัดลอกค่าคอลัมน์ลงในตัวแปร
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}Scan รับพอยน์เตอร์
Scan จะเขียนค่าลงในตัวแปรที่ส่งให้ ดังนั้นคุณต้องส่งพอยน์เตอร์ (&id, &name) จำนวนและลำดับของพอยน์เตอร์ต้องตรงกับคอลัมน์ที่เลือก
ตรวจสอบ rows.Err
ลูปอาจจบลงเพราะข้อมูลหมด หรือเพราะเกิดข้อผิดพลาดระหว่างการวนอ่าน หลังจบลูป ให้เรียก rows.Err() เพื่อจับข้อผิดพลาดระหว่างการวนอ่าน
if err := rows.Err(); err != nil {
log.Fatal(err)
}QueryRow สำหรับหนึ่งแถว
เมื่อคาดว่าจะได้แถวเดียว การใช้ QueryRow ร่วมกับ Scan จะกระชับกว่า หากไม่มีแถวที่ตรงกัน Scan จะส่งคืน sql.ErrNoRows
var name string
err := db.QueryRow("SELECT name FROM users WHERE id = $1", 7).Scan(&name)
if err == sql.ErrNoRows {
fmt.Println("not found")
}การจำลอง Scan ที่เรียกใช้งานได้
การสอบถามจริงต้องใช้ฐานข้อมูล ดังนั้นตัวอย่างที่เรียกใช้งานได้นี้จึงจำลองลำดับการทำงานของ Query, Next และ Scan บนส่วนข้อมูลในหน่วยความจำ เพื่อแสดงรูปแบบการวนอ่าน
package main
import "fmt"
type Row struct {
ID int
Name string
}
func main() {
rows := []Row{{1, "Ada"}, {2, "Lin"}, {3, "Guido"}}
for i := 0; i < len(rows); i++ {
var id int
var name string
id = rows[i].ID
name = rows[i].Name
fmt.Printf("id=%d name=%s\n", id, name)
}
fmt.Println("scanned", len(rows), "rows")
}การจัดการค่า NULL
คอลัมน์ที่มีค่า NULL ไม่สามารถสแกนลงใน string หรือ int ธรรมดาได้ ให้ใช้ sql.NullString, sql.NullInt64 หรือชนิดพอยน์เตอร์ เพื่อให้โค้ดแยกแยะ NULL ออกจากค่าว่างได้
var email sql.NullString
rows.Scan(&email)
if email.Valid {
fmt.Println(email.String)
}การสแกนลงในโครงสร้าง
ไลบรารีมาตรฐานจะสแกนลงในตัวแปรแต่ละตัว ไม่ใช่โครงสร้างทั้งก้อน คุณจับคู่คอลัมน์กับฟิลด์ของโครงสร้างโดยส่ง &u.ID, &u.Name ให้ ไลบรารีอย่าง sqlx ช่วยทำขั้นตอนนี้โดยอัตโนมัติ
หลีกเลี่ยง SELECT *
ระบุคอลัมน์อย่างชัดเจนเพื่อให้ลำดับที่ Scan ใช้คงที่ การเปลี่ยนแปลงโครงสร้างฐานข้อมูลที่เพิ่มคอลัมน์จะทำให้ Scan แบบอาศัยตำแหน่งเสียหายโดยไม่แจ้งเตือน หากคุณใช้ SELECT *
ตรวจสอบอย่างรวดเร็ว
ทดสอบความรู้เกี่ยวกับการสอบถามของคุณ
สรุป
คุณได้เรียนรู้การสอบถามแถว:
- Query ส่งคืน *sql.Rows; ใช้ defer rows.Close()
- วนลูปด้วย rows.Next แล้วคัดลอกค่าผ่าน Scan ลงในพอยน์เตอร์
- ตรวจสอบ rows.Err() หลังจบลูป
- ใช้ QueryRow สำหรับแถวเดียว และ sql.ErrNoRows เมื่อไม่พบข้อมูล
- ใช้ชนิด Null กับคอลัมน์ที่อาจไม่มีค่า
คำถามที่พบบ่อย
บทเรียน “การสอบถามแถวข้อมูล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสอบถามแถวข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสอบถามแถวข้อมูล”
อ่านชุดผลลัพธ์ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การสอบถามแถวข้อมูล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเปิดการเชื่อมต่อ
- การสอบถามแถวข้อมูล
- คำสั่งที่เตรียมไว้
- ธุรกรรม