การใช้ 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"`
}