database/sql และไดรเวอร์
ตั้งค่า DB, QueryRow, Scan และกลุ่มการเชื่อมต่อ
database/sql และไดรเวอร์ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวม database/sql
database/sql คือชั้นนามธรรมมาตรฐานสำหรับฐานข้อมูลของ Go โดยจัดการกลุ่มการเชื่อมต่อและทำงานกับฐานข้อมูลใดก็ได้ผ่านปลั๊กอินไดรเวอร์
การลงทะเบียนไดรเวอร์
นำเข้าแพ็กเกจไดรเวอร์เพื่อให้เกิดผลข้างเคียง (การลงทะเบียนไดรเวอร์) จากนั้นเปิดการเชื่อมต่อ:
import _ "github.com/lib/pq" // PostgreSQL driver
db, err := sql.Open("postgres", "postgres://user:pass@localhost/mydb?sslmode=disable")
if err != nil { log.Fatal(err) }
defer db.Close()sql.Open กับ db.Ping
sql.Open ยังไม่เชื่อมต่อ แต่จะตรวจสอบ DSN เรียก db.Ping() หรือ db.PingContext(ctx) เพื่อตรวจสอบว่าการเชื่อมต่อยังทำงานอยู่
if err := db.Ping(); err != nil { log.Fatal(err) }การสืบค้นแถวข้อมูล
ใช้ db.QueryContext เพื่อดำเนินการ SELECT และสแกนแถวข้อมูล:
rows, err := db.QueryContext(ctx, "SELECT id, name FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()
for rows.Next() {
var id int; var name string
rows.Scan(&id, &name)
}การสืบค้นแถวเดียว
db.QueryRowContext จะส่งคืน *Row สำหรับการสืบค้นที่คาดว่าจะส่งคืนผลลัพธ์ไม่เกินหนึ่งรายการ:
var name string
err := db.QueryRowContext(ctx, "SELECT name FROM users WHERE id = $1", id).Scan(&name)
if errors.Is(err, sql.ErrNoRows) { /* not found */ }การดำเนินการเปลี่ยนแปลงข้อมูล
ใช้ db.ExecContext สำหรับ INSERT, UPDATE, DELETE โดยจะส่งคืน Result ที่มีจำนวนแถวที่ได้รับผลกระทบและรหัส ID ของรายการที่แทรกล่าสุด
result, err := db.ExecContext(ctx, "INSERT INTO users(name) VALUES($1)", name)
if err != nil { return err }
id, _ := result.LastInsertId()คำสั่งที่เตรียมไว้ล่วงหน้า
เตรียมคำสั่งหนึ่งครั้ง แล้วดำเนินการซ้ำหลายครั้งได้อย่างมีประสิทธิภาพ:
stmt, err := db.PrepareContext(ctx, "SELECT id FROM users WHERE email = $1")
defer stmt.Close()
for _, email := range emails {
row := stmt.QueryRowContext(ctx, email)
}การตั้งค่ากลุ่มการเชื่อมต่อ
กำหนดค่ากลุ่มการเชื่อมต่อสำหรับระบบจริง:
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(25)
db.SetConnMaxLifetime(5 * time.Minute)การตรวจสอบ rows.Err()
หลังจบลูปแถวข้อมูล ให้ตรวจสอบ rows.Err() เสมอ — ลูปอาจจบก่อนกำหนดเนื่องจากข้อผิดพลาดของเครือข่าย
if err := rows.Err(); err != nil { return err }ค่า Null
ใช้ sql.NullString, sql.NullInt64 และชนิดอื่น ๆ เพื่อจัดการค่า NULL จากฐานข้อมูล ซึ่งอาจทำให้เกิดแพนิกหากสแกนลงในชนิด Go ที่ไม่ใช่พอยน์เตอร์
var bio sql.NullString
rows.Scan(&bio)
if bio.Valid { fmt.Println(bio.String) }รายการไดรเวอร์
ไดรเวอร์ยอดนิยม: github.com/lib/pq (PostgreSQL), github.com/go-sql-driver/mysql (MySQL), modernc.org/sqlite (SQLite, Go ล้วน)
ตรวจสอบความเข้าใจอย่างรวดเร็ว
เหตุใดคุณจึงต้องเรียก rows.Close() และตรวจสอบ rows.Err() เสมอหลังการสืบค้น
สรุป: database/sql
ประเด็นสำคัญ:
- นำเข้าไดรเวอร์ด้วย _ เพื่อให้เกิดผลข้างเคียง ใช้ sql.Open + Ping
- QueryContext → rows.Next + Scan + rows.Close + rows.Err
- ใช้ ExecContext สำหรับการเปลี่ยนแปลงข้อมูล และ QueryRowContext สำหรับแถวเดียว
- ใช้ SetMaxOpenConns, SetMaxIdleConns, SetConnMaxLifetime สำหรับกลุ่มการเชื่อมต่อ
คำถามที่พบบ่อย
บทเรียน “database/sql และไดรเวอร์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “database/sql และไดรเวอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “database/sql และไดรเวอร์”
ตั้งค่า DB, QueryRow, Scan และกลุ่มการเชื่อมต่อ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “database/sql และไดรเวอร์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- database/sql และไดรเวอร์
- sqlx: การสแกนสตรักต์และคิวรีแบบตั้งชื่อ
- pgx: ไดรเวอร์ PostgreSQL ประสิทธิภาพสูง
- ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล