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

การเปิดการเชื่อมต่อ

เชื่อมต่อกับฐานข้อมูล

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

แพ็กเกจ database/sql

แพ็กเกจมาตรฐานของ Go อย่าง database/sql มีส่วนติดต่อการเขียนโปรแกรมทั่วไปที่ไม่ผูกกับฐานข้อมูลใดโดยเฉพาะ คุณใช้แพ็กเกจนี้ร่วมกับไดรเวอร์ของฐานข้อมูลที่ต้องการ เช่น PostgreSQL หรือ MySQL

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

การนำเข้าไดรเวอร์

ไดรเวอร์ลงทะเบียนตัวเองผ่านการนำเข้าแบบเปล่า ขีดล่างหมายความว่าคุณนำเข้าไดรเวอร์เพื่อให้เกิดผลข้างเคียงคือการลงทะเบียนเท่านั้น ไม่ได้ใช้เรียกไดรเวอร์โดยตรง

import (
    "database/sql"
    _ "github.com/lib/pq"
)

sql.Open

sql.Open รับชื่อไดรเวอร์และชื่อแหล่งข้อมูล (DSN) แต่ยังไม่ได้เชื่อมต่อจริง เพียงเตรียมพูลไว้เท่านั้น

db, err := sql.Open("postgres", "postgres://user:pass@localhost/mydb?sslmode=disable")
if err != nil {
    log.Fatal(err)
}

db คือพูลการเชื่อมต่อ

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

ตรวจสอบด้วย Ping

เนื่องจาก Open ทำงานแบบเชื่อมต่อเมื่อจำเป็น ให้ใช้ Ping เพื่อสร้างการเชื่อมต่อจริง ตรวจสอบว่าฐานข้อมูลเข้าถึงได้ และยืนยันว่าข้อมูลรับรองถูกต้อง

if err := db.Ping(); err != nil {
    log.Fatal("cannot reach db:", err)
}

การปิดพูล

ใช้ defer db.Close() ในฟังก์ชัน main หรือฟังก์ชันตั้งค่า โดยทั่วไปไม่จำเป็นต้องปิดต่อคำสั่งสอบถาม ให้ปิดเมื่อแอปพลิเคชันทั้งหมดกำลังหยุดทำงานเท่านั้น

defer db.Close()

การปรับแต่งพูล

ควบคุมพูลด้วย SetMaxOpenConns, SetMaxIdleConns และ SetConnMaxLifetime วิธีเหล่านี้ป้องกันไม่ให้ใช้การเชื่อมต่อฐานข้อมูลจนหมด และช่วยหมุนเวียนการเชื่อมต่อที่ค้างเก่า

db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)

ตัวอย่างในหน่วยความจำที่เรียกใช้งานได้

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

package main

import (
    "errors"
    "fmt"
)

type DB struct{ dsn string }

func Open(driver, dsn string) (*DB, error) {
    if dsn == "" {
        return nil, errors.New("empty dsn")
    }
    return &DB{dsn: dsn}, nil
}

func (db *DB) Ping() error { return nil }
func (db *DB) Close() error { return nil }

func main() {
    db, err := Open("postgres", "postgres://localhost/mydb")
    if err != nil {
        fmt.Println("open error:", err)
        return
    }
    defer db.Close()
    if err := db.Ping(); err != nil {
        fmt.Println("ping error:", err)
        return
    }
    fmt.Println("connected to", db.dsn)
}

รูปแบบที่รองรับบริบท

ควรใช้ PingContext, QueryContext และ ExecContext เพื่อให้การเรียกใช้งานเคารพกำหนดเวลาและการยกเลิก การส่งบริบทเข้าไปจะจำกัดระยะเวลาที่การเรียกฐานข้อมูลซึ่งค้างอยู่สามารถบล็อกได้

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
err := db.PingContext(ctx)

รูปแบบ DSN

ไดรเวอร์แต่ละตัวกำหนด DSN ของตนเอง PostgreSQL รองรับ URL ส่วน MySQL ใช้ user:pass@tcp(host:3306)/dbname ตรวจสอบเอกสารของไดรเวอร์เสมอ และหลีกเลี่ยงการเขียนข้อมูลรับรองแบบตายตัวในโค้ด

พูลเดียว ใช้งานระยะยาว

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

ตรวจสอบอย่างรวดเร็ว

ทดสอบความรู้เกี่ยวกับการเชื่อมต่อของคุณ

สรุป

คุณได้เรียนรู้การเปิดการเชื่อมต่อ:

  • นำเข้าไดรเวอร์แบบเปล่า แล้วเรียก sql.Open ด้วยไดรเวอร์และ DSN
  • *sql.DB เป็นพูลที่ปลอดภัยสำหรับการทำงานพร้อมกัน และเปิดเพียงครั้งเดียว
  • Ping ตรวจสอบการเชื่อมต่อจริง
  • ปรับแต่งพูลและใช้เมธอดที่รองรับบริบท
  • ใช้ defer db.Close() เมื่อหยุดทำงาน

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

บทเรียน “การเปิดการเชื่อมต่อ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การเปิดการเชื่อมต่อ”

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

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

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

บทเรียน “การเปิดการเชื่อมต่อ” ใช้เวลานานแค่ไหน

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

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

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

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

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