การใช้ GORM กับ MySQL


GORM เป็น Go ORM ช่วยให้เรา Map ระหว่างโครงสร้างของ Column ใน Table ของ Database กับ Field ของ Struct ใน Go ได้ เช่น หากท่านต้องการบันทึกอะไรสักอย่างลงฐานข้อมูล ท่านสามารถใช้ obj.save() หรือ code concept ประมาณนี้ได้ แทนที่จะต้องเขียน sql query string ทั้งหมด ลดการ redundant, duplication ลงได้เยอะมาก group คำสั่ง ลดความสับสนและให้ความหมายกับ code statement นั้น

การใช้ GORM กับ MySQL นั้น GORM มีระบบ Migration ที่สามารถนำเอา data model ไปสร้างตารางฐานข้อมูลได้เลย โดยไม่ต้องไป query create table เอง

ข้อกำหนดเบื้องต้น


ข้อกำหนดสำหรับบทความนี้คือ คุณควรได้ทำตามบทความ ติดตั้ง Go บน Mac  และ ติดตั้ง MySQL บน Mac มาก่อน


สร้างโปรเจค gorm-basics


สร้างโปรเจคใหม่ ในตัวอย่างชื่อ gorm-basics สร้างไฟล์ main.go เปิดเทอร์มินัลแล้วใช้คำสั่ง

go mod init gorm-basics


GORM สำหรับ Go


เราจะใช้ ORM ( Object-Relational-Mapping ) เพื่อทำให้การโต้ตอบกับฐานข้อมูลง่ายขึ้น

go get -u gorm.io/gorm


ติดตั้ง GORM MySQL Driver

go get gorm.io/driver/mysql


ทดสอบเชื่อมต่อ Database


ที่ไฟล์ main.go เขียนโค้ดดังนี้

package main

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

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	fmt.Println(db)
}									



ทดสอบการทำงาน ถ้าไม่แสดงความผิดพลาดใดๆ คือ สามารถเชื่อมต่อกับ database ได้

go run main.go

การสร้างตาราง (Tables)


ที่ไฟล์ main.go เขียนโค้ดดังนี้

package main

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

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})
}

type User struct {
	Id       int
	FirsName string
	LastName string
	Email    string
}


ทดสอบการทำงาน ด้วยคำสั่ง go run main.go แล้วคลิกขวาที่ไฟล์ go_basics -> Refresh


จะพบตาราง user และคอลัมน์ ต่างๆเพิ่มเข้ามา


เพิ่มข้อมูล (Records)


ที่ไฟล์ main.go เขียนโค้ดดังนี้

package main

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

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})

	user := User{
		FirsName: "Go",
		LastName: "Developers",
		Email: "godevth@gmail.com",
	}

	db.Create(&user)
}

type User struct {
	Id       int
	FirsName string
	LastName string
	Email    string
}


ดูข้อมูลที่เพิ่มเข้าไป


คลิกขวาที่ตาราง user -> Select Top 1000 -> Results จะแสดงข้อมูลที่เพิ่มเข้าไป


แก้ไขข้อมูล (Updating Records)

package main

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

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})

	user := User{
		Id:       1,
		FirsName: "Go2",
		LastName: "Developers2",
		Email:    "go2devth@gmail.com",
	}

	db.Updates(&user)
}

type User struct {
	Id       int
	FirsName string
	LastName string
	Email    string
}


ลบข้อมูล (Deleting Records)

package main

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

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})

	user := User{
		Id: 1,
	}

	db.Delete(&user)
}

type User struct {
	Id       int
	FirsName string
	LastName string
	Email    string
}

เพิ่มข้อมูลแบบ อาร์เรย์

package main

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

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})

	users := []User{
		{
			FirsName: "John",
			LastName: "Doe",
			Email:    "john@doe.com",
		},
		{
			FirsName: "Jany",
			LastName: "Smith",
			Email:    "jany@smith.com",
		},
		{
			FirsName: "William",
			LastName: "Blake",
			Email:    "william@blake.com",
		},
	}

	for _, user := range users {
		db.Create(&user)
	}
}

type User struct {
	Id       int
	FirsName string
	LastName string
	Email    string
}


ดึงข้อมูลแรก (First Records)

package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})

	user := User{}

	db.First(&user)

	fmt.Println(user)

	
}

type User struct {
	Id       int
	FirsName string
	LastName string
	Email    string
}

ดึงข้อมูลสุดท้าย (Last Records)

package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})

	user := User{}

	db.Last(&user)

	fmt.Println(user)

	
}

type User struct {
	Id       int
	FirsName string
	LastName string
	Email    string
}

ดึงข้อมูลตามคำค้นหา (Querying Records)


package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})

	user := User{}

	db.Where(&User{LastName: "Smith"}).First(&user)

	fmt.Println(user)

}

type User struct {
	Id       int
	FirsName string
	LastName string
	Email    string
}


Gorm Model


package main

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

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})
}

type User struct {
	gorm.Model
	FirsName string
	LastName string
	Email    string
}
package main

import (
	"fmt"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:12345678@tcp(localhost:3306)/go_basics?parseTime=true"
	dial := mysql.Open(dsn)
	db, err := gorm.Open(dial)
	if err != nil {
		panic(err)
	}

	db.AutoMigrate(&User{})

	user := User{
		Model: gorm.Model{
			CreatedAt: time.Now(),
		},
	}

	fmt.Println(user)
}

type User struct {
	gorm.Model
	FirsName string `gorm:"type:VARCHAR(30)"`
	LastName string `gorm:"size:100"`
	Email    string `gorm:"unique"`
}

Leave a Reply

Your email address will not be published. Required fields are marked *