Skip to main content

Implement Gorm และ MySQL ใน Go

ในส่วนของ Gorm นั้นคือ  Library ORM ของ Go ที่ช่วยเราเก็บข้อมูลลง server หรือ get ข้อมูลมาใช้ ได้คล้ายกับ Prisma หรือ SQL โดยที่ gorm รองรับทั้ง supports the databases MySQL, PostgreSQL, SQLite, SQL Server 

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

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









วิธีการเข้าVPNมอKmuttที่บ้านตัวอย่างการใช้ 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)
}

วิธีการเข้าVPNมอKmuttที่บ้าน

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
        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 เผื่อเป็น object ที่ไว้รองรับของจาก database server (คล้ายกับ Prisma)

    image.png

    type Products struct {
    	Id      uint
    	Name    string
    	Price   int
    	On_sale bool
    }
    
    func main {
      ....
    	var product Products
      ....
    }

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

    	var product Products
    	db.First(&product)

    image.png

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

    เมื่อเราสามารถ connect ต่อมาจะเรียนรู้คำสั่งพื้นฐานของ 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 ขึ้นมาก่อนละค่อยนำ

    	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

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

    Batch Delete

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