การใช้งาน MySQLใน Go Fiber

Ammyanchalee
I GEAR GEEK
Published in
3 min readApr 23, 2024

สวัสดีค่ะ ในบทความนี้เราจะมาพูดถึงวิธีการใช้งานฐานข้อมูลใน Go Fiber กันค่ะ การเชื่อมต่อและจัดการข้อมูลในฐานข้อมูลเป็นส่วนสำคัญของการพัฒนาแอปพลิเคชัน ในที่นี้เราจะใช้ MySQL เป็นตัวอย่าง

MySQL คืออะไร

MySQL คือระบบจัดการฐานข้อมูลแบบข้อมูลเชิงสัมพันธ์ (RDBMS) ที่ใช้ในการจัดเก็บข้อมูลในรูปแบบตาราง มีการแบ่งข้อมูลเป็นแถวและคอลัมน์ ช่วยให้ง่ายต่อการเชื่อมโยงและควบคุมข้อมูล มีประสิทธิภาพและยืดหยุ่น นิยมใช้งานมากในการพัฒนาและเชื่อมโยงข้อมูลในแอปพลิเคชันต่าง ๆ

เริ่มต้นด้วยการเชื่อมต่อกับ MySQL Database กันค่ะ ใช้งานไลบรารี gorm และ mysql

GORM Guides 👉 https://gorm.io/docs/

package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

func main() {
// เชื่อมต่อ MySQL Database
dsn := "user:password@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

defer db.Close()
}

ต่อมาเราจะสร้างโมเดลของข้อมูลที่ต้องการจัดเก็บในฐานข้อมูล โดยใช้ struct ใน Go

type User struct {
gorm.Model
Name string
Email string
}

หลังจากนั้น เราจะสร้างตารางในฐานข้อมูล MySQL โดยใช้ AutoMigrate:

func Migrate(db *gorm.DB) {
db.AutoMigrate(&User{})
}

เมื่อเราเตรียมฐานข้อมูลและโมเดลแล้ว เราสามารถสร้างและดึงข้อมูลได้ดังนี้:

// สร้างข้อมูลใหม่
func CreateUser(db *gorm.DB, name, email string) {
user := User{Name: name, Email: email}
db.Create(&user)
}

// ดึงข้อมูลทั้งหมด
func GetAllUsers(db *gorm.DB) []User {
var users []User
db.Find(&users)
return users
}

// ดึงข้อมูลด้วย ID
func GetUserByID(db *gorm.DB, id uint) (User, error) {
var user User
result := db.First(&user, id)
return user, result.Error
}

ตัวอย่างการใช้งานใน Go Fiber:

package main

import (
"github.com/gofiber/fiber/v2"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

// User เป็นโครงสร้างข้อมูลผู้ใช้
type User struct {
gorm.Model
Name string
Email string
}

// Migrate สร้างตารางในฐานข้อมูล MySQL
func Migrate(db *gorm.DB) {
db.AutoMigrate(&User{})
}

// CreateUser สร้างข้อมูลผู้ใช้ใหม่
func CreateUser(db *gorm.DB, name, email string) {
user := User{Name: name, Email: email}
db.Create(&user)
}

// GetAllUsers ดึงข้อมูลผู้ใช้ทั้งหมด
func GetAllUsers(db *gorm.DB) []User {
var users []User
db.Find(&users)
return users
}

// GetUserByID ดึงข้อมูลผู้ใช้ด้วย ID
func GetUserByID(db *gorm.DB, id string) (User, error) {
var user User
result := db.First(&user, id)
return user, result.Error
}

func main() {
// เชื่อมต่อ MySQL Database
dsn := "user:password@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
defer db.Close()

// สร้างตารางในฐานข้อมูล MySQL
Migrate(db)

// สร้าง Fiber App
app := fiber.New()

// สร้าง Endpoint เพื่อสร้างข้อมูลผู้ใช้ใหม่
app.Post("/users", func(c *fiber.Ctx) error {
var user User
if err := c.BodyParser(&user); err != nil {
return err
}
CreateUser(db, user.Name, user.Email)
return c.SendStatus(fiber.StatusCreated)
})

// สร้าง Endpoint เพื่อดึงข้อมูลผู้ใช้ทั้งหมด
app.Get("/users", func(c *fiber.Ctx) error {
users := GetAllUsers(db)
return c.JSON(users)
})

// สร้าง Endpoint เพื่อดึงข้อมูลผู้ใช้ด้วย ID
app.Get("/users/:id", func(c *fiber.Ctx) error {
id := c.Params("id")
user, err := GetUserByID(db, id)
if err != nil {
return c.SendStatus(fiber.StatusNotFound)
}
return c.JSON(user)
})

// รัน Fiber App ที่พอร์ต 8080
app.Listen(":8080")
}

ข้อดี

  1. ความยืดหยุ่น: การใช้งานฐานข้อมูลใน Go Fiber ช่วยให้เราสามารถจัดการข้อมูลในแอปพลิเคชันได้อย่างยืดหยุ่น และปรับแต่งตามความต้องการของโปรเจคได้โดยง่าย เช่น
  • ปรับแต่งโครงสร้างข้อมูล: เราสามารถเพิ่มหรือลบฟิลด์ในตารางฐานข้อมูล และปรับเปลี่ยนประเภทข้อมูลได้ตามความต้องการของโปรเจค
  • ปรับแต่งการเชื่อมต่อ: เราสามารถปรับแต่งการเชื่อมต่อฐานข้อมูลเช่นการกำหนด DSN, การใช้โปรโตคอลและการตั้งค่าการเชื่อมต่อเพื่อให้เหมาะสมกับแอปพลิเคชันของเรา
  • จัดการข้อมูล: เราสามารถเพิ่ม แก้ไข ลบ หรือค้นหาข้อมูลได้อย่างยืดหยุ่นตามความต้องการของแอปพลิเคชัน

2. ประสิทธิภาพ: Go Fiber มีประสิทธิภาพสูงในการทำงานและการประมวลผลข้อมูล ทำให้สามารถจัดการกับฐานข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพ

ขยายความเพิ่มเติม -> GORM สามารถจัดระเบียบในการ จัดการฐานข้อมูล กับโครงสร้างของภาษา Golang ได้อย่างมีประสิทธิภาพ ฯลฯ

3. การจัดการข้อผิดพลาด: ด้วยการใช้ Go Fiber ร่วมกับฐานข้อมูล เราสามารถจัดการกับข้อผิดพลาดที่เกิดขึ้นในการเชื่อมต่อฐานข้อมูลหรือการดึงข้อมูลได้อย่างมีประสิทธิภาพ

ข้อเสีย

  1. ความซับซ้อนในการตั้งค่า: การเชื่อมต่อฐานข้อมูลใน Go Fiber อาจซับซ้อนเนื่องจากต้องนำเข้าไลบรารีเสริมเพื่อการเชื่อมต่อ และการกำหนดค่า DSN ซึ่งเป็นส่วนประกอบของไลบรารีเหล่านั้น ส่วน Fiber เองยังไม่มีฟีเจอร์เชื่อมต่อฐานข้อมูลโดยตรงที่สามารถใช้งานได้โดยตรง
  2. การจัดการข้อมูลซับซ้อน: เมื่อโปรเจคมีข้อมูลที่มีโครงสร้างซับซ้อน การจัดการและแก้ไขฐานข้อมูลใน GORM อาจมีความซับซ้อนมากขึ้น
  3. ความไม่เสถียรในการเชื่อมต่อ: การเชื่อมต่อฐานข้อมูลใน Go Fiber อาจไม่เสถียรเมื่อมีปัญหา เช่น การต่ออายุการเชื่อมต่อหรือการขาดการเชื่อมต่อ ซึ่งส่งผลต่อประสิทธิภาพและความพร้อมในการให้บริการของแอปพลิเคชัน
  4. การปรับแต่งที่จำเป็น: บางครั้งการใช้งานฐานข้อมูลใน Go Fiber อาจต้องการการปรับแต่งเพิ่มเติมในกรณีที่ต้องการฟีเจอร์พิเศษหรือการทำงานที่ซับซ้อนมากขึ้น เช่น การใช้งาน Transaction Raw SQL และ Connection Pool

ข้อแนะนำเพิ่มเติมในการใช้งาน GORM

  • การใช้งาน Transaction: ในกรณีที่ต้องการดำเนินการหลาย ๆ คำสั่ง SQL พร้อมกัน และต้องการให้การดำเนินการเหล่านั้นถูกตรวจสอบเพื่อความถูกต้อง การใช้งาน Transaction เป็นเครื่องมือที่จำเป็น เพื่อให้ระบบมีความปลอดภัยและไม่เกิดข้อผิดพลาดในการทำงาน
  • การใช้งาน Raw SQL: ในกรณีที่ต้องการความยืดหยุ่นในการเขียนคำสั่ง SQL ที่ซับซ้อนหรือไม่สามารถทำได้ด้วย ORM อาจต้องใช้งาน Raw SQL เพื่อปรับแต่งคำสั่ง SQL ตามความต้องการ
  • การใช้งาน Connection Pool: เพิ่มการปรับแต่งในการจัดการ Connection Pool เช่น การกำหนดขนาด Pool หรือการกำหนดการต่ออายุของ Connection เพื่อให้การเชื่อมต่อมีประสิทธิภาพและเสถียรมากยิ่งขึ้น

ในบทความนี้ เราได้เรียนรู้เกี่ยวกับวิธีการใช้งานฐานข้อมูลใน Go Fiber โดยการเชื่อมต่อ MySQL Database การสร้างโมเดล การสร้างและดึงข้อมูลและข้อดีข้อเสียของการใช้งาน Database ใน Go Fiber ซึ่งทำให้เราสามารถพัฒนาแอปพลิเคชัน Go Fiber ที่มีความสามารถในการจัดการข้อมูลได้อย่างมีประสิทธิภาพและง่ายดายมากยิ่งขึ้นค่ะ

--

--