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

การสอบถามแถวข้อมูล

อ่านชุดผลลัพธ์

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

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

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