Skip to main content

Implement Gorm และ MySQL ใน Go

ในส่วนของ Gorm นั้นคือ  Library ORM (Object-relational Mapping) ของ Go เอาไว้ทำ CRUD (Create, Read, Update, Delete) เช่น เก็บข้อมูลลง server หรือ ดึงข้อมูลมาใช้ คล้ายกับ Prisma โดยที่ไม่ต้องเขียน SQL เอง ซึ่ง gorm รองรับทั้ง MySQL, PostgreSQL, SQLite, SQL Server 

เราสามารถใช้ gorm ได้ ผ่านการ import 

import (
  "gorm.io/gorm"
  "gorm.io/driver/typedatabaseของคุณ"
)


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

package main

import (// การ import gorm เข้ามาใช้
  "gorm.io/gorm"
  "gorm.io/driver/sqlite"
)

type Product struct {// สร้าง model schema 
  gorm.Model
  Code  string
  Price uint
}

func main() {// func gorm
  db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
  if err != nil {
    panic("failed to connect database")
  }

  // Migrate the schema
  db.AutoMigrate(&Product{})

  // Create
  db.Create(&Product{Code: "D42", Price: 100})

  // Read
  var product Product
  db.First(&product, 1) // find product with integer primary key
  db.First(&product, "code = ?", "D42") // find product with code D42

  // Update - update product's price to 200
  db.Model(&product).Update("Price", 200)
  // Update - update multiple fields
  db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // non-zero fields
  db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})

  // Delete - delete product
  db.Delete(&product, 1)
}


How to connect MySQL

  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

เช่น การเข้า workshop ของ GDSC

  • Host: gdsc-int.sit.kmutt.ac.th (ต้องต่อผ่าน vpn มอนะ)
    - Port: 13306
    - Username: workshop01
    - Password: DBpAhVUgCMDSLwwP
    - dbname: workshop01
  • วิธีการเข้า VPN KMUTT

    dsn := "workshop01:DBpAhVUgCMDSLwwP@tcp(gdsc-int.sit.kmutt.ac.th:13306)/demo_store?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

เมื่อเข้าแล้ว ลอง test connection โดยการ

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)


func main() {
	dsn := "workshop01:DBpAhVUgCMDSLwwP@tcp(gdsc-int.sit.kmutt.ac.th:13306)/workshop01?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
		if err != nil {
		panic("fail connection")
        } else {
        	fmt.Println("Connecting successful")
          	fmt.Println(db) //เป็นการเรียกใช้ db เพื่อไม่ให้แดงเฉยๆ
        }
}

ถ้าสำเร็จก็จะขึ้นแบบนี้

image.png

Basic Gorm

ขั้นตอนแรกคือเราต้อง สร้าง struct หรือ model schema เพื่อเป็น object ที่ไว้รองรับข้อมูลจาก database server

image.png

type Products struct {
	Id      uint
	Name    string
	Price   int
	On_sale bool
}

func main {
  ....
	var product Products
  ....
}

จากนั้นเราจะทำการหยิบเอา table แรกของ database ใส่ใน struct ของเรา ผ่านคำสั่ง First() ของ gorm

	var product Products
	db.First(&product)

image.png

คำสั่งพื้นฐาน ใน Gorm

เมื่อเราสามารถ connect กับ database สำเร็จ เราจะมาเรียนรู้คำสั่งพื้นฐานของ Gorm กันว่า Gorm อะไรได้บ้าง

Create

คำสั่ง Create เป็นการ add table ลงใน database server

เราสามารถ create table ได้หลายแบบเช่น

การ Create แบบใส่ข้อมูล struct แต่ละตัว 

	db.Create(&Products{
		Id:      2,
		Name:    "Iphone 13",
		Price:   29900,
		On_sale: true,
	})

การ Create แบบใส่สร้างตัวแปร struct ขึ้นมาก่อนละค่อยนำไปสร้างเป็น table

	iphone_14_pro := Products{
		Id:      3,
		Name:    "Iphone 14 Pro",
		Price:   41900,
		On_sale: true,
	}
	db.Create(&iphone_14_pro)


image.png

Update

คือการ update ค่าใน table นั้นๆ

Example 

	iphone_14_pro.Name = "Iphone 14 Pro max"
	iphone_14_pro.Price = 44900
	db.Save(&iphone_14_pro)

image.png

Delete

ลบ table ใน database server

db.Delete(product)

image.png

Delete Where 

การลบ table ใน database server โดยมีเงื่อนไข

db.Where("name = ?", "Iphone 13").Delete(&product)

image.png

ข้อควรระวัง

เมื่อลบ ค่าที่ถูกลบจะต้องมีคีย์หลัก มิฉะนั้นจะทำให้เกิด Batch Delete 

Batch Delete

คือ ค่าที่ระบุไม่มีค่าหลัก GORM จะทำการลบแบบกลุ่ม และจะลบ table ที่ตรงกันทั้งหมด

db.Where("name LIKE ?", "%Iphone%").Delete(&Products{})

image.png


สามารถอ่านเพิ่มเติมได้ที่ doc 

GORM Guides | GORM - The fantastic ORM library for Golang, aims to be developer friendly.