[อ่านบน Medium]
สวัสดีครับ อันนี้น่าจะเป็นการเขียนบทความ ที่ 2 ของผมครับ ไม่ได้เขียนนานเลย แต่ไหนๆก็จะมีโอกาสมาลองอะไรใหม่ๆ อย่างภาษาสุดยอดฮิตอย่างภาษา Go นั่นเองครับ
โดยในบทความนี้ผมจะนำภาษา Go มาใช้กับ MySQL เพื่อจะนำไปพัฒนาเป็น Application หรือระบบที่มีการทำ CRUD ในอนาคตครับ หากพร้อมแล้ว เราไปลุยกันเลย!
ก่อนอื่นเลยต้องบอกก่อนว่าก่อนหน้านี้ผมได้มีโอกาสแตะภาษา Go บ้าง ในฐานะ Developer มือใหม่ที่อยากรู้อยากลองไปเรื่อย (เอาจริงๆตอนนี้ก็ยังเป็นแบบนั้นอยู่) ยังไงก็แล้วแต่วันนี้ก็ได้มาลองเชื่อมกับ Database ยอดฮิตเหมือนกัน เพื่อปูทางการย้ายมาในอนาคต หากตลาดงานเป็นใจ จะได้ย้ายจากภาษาที่เป็นขวัญใจผมมานานอย่าง Java ซักที
ทำไมถึงเป็น Go แล้วมันดียังไง?
ภาษา Go นั้นสร้างขึ้นมาโดย Google ตั้งแต่ปี 2007 และเปิดเป็น Open-Source ตั้งแต่นั้นมาก็นิยมใช้กันขึ้นมาเรื่อยๆ
ข้อดี
- รองรับทุก OS (Window, Linux, Mac)
- ใช้ระยะเวลาศึกษาไม่นาน
- หา Component ต่างๆ เพื่อให้สะดวกต่อการพัฒนาได้ง่าย และติดตั้งได้ง่ายดาย
- ทำงานเร็ว ลดเวลาการ compile ทุกครั้งที่มีการเรียกใช้
- หลายๆบริษัทใหญ่ๆเลือกใช้
หลายคนอาจจะติดคำถามจากข้อ 5 ว่า มีบริษัทไหนบ้างน้า
บริษัทที่ใช้ภาษา Go มีทั่วโลกเลยครับ ตัวอย่างในไทยก็เช่น Line, Grab, Lineman Wongnai, KBTG ส่วนใน Scale ระดับโลกก็จะมี Amazon, Apple, Microsoft, Facebook, Github ครับ ซึ่งสังเกตได้ว่า เรารู้จักกันแทบหมดเลย และเพราะด้วยข้อดีที่ได้กล่าวมานั่นแหละครับ เลยทำให้ภาษา Go นั้นเป็นที่นิยมมากๆ
อวยกันขนาดนี้ เริ่มอยากเห็นการทำจริงๆแล้วล่ะสิ เอาล่ะไปลุยกันจริงๆซักที!
เริ่มที่ MySQL กันก่อน
ก่อนอื่นเลยผมจะทำการเข้าไปที่ MySQL Commandline เพื่อเข้าไปสร้าง Database สำหรับการทดลองกัน
mysql -u root -p
จากนั้นผมจะทำการสร้าง database "testgowithmysql" สำหรับการทดสอบ
CREATE DATABASE testgowithmysql;
ในขั้นตอนนี้เราก็จะได้ Database สำหรับลองเล่นกันแล้วครับ
ลุยกับ GO
ในที่สุดส่วนนี้ก็มาถึง ความสนุกของเรานั่นเองครับ ก่อนอื่นเลยให้เพื่อนๆเข้า Text Editor หรือ IDE ที่เพื่อนๆถนัดสำหรับการลุยในส่วนนี้กันครับ
อ้อ ลืมบอก สำหรับเพื่อนๆที่ยังไม่ได้ Install Go อย่าลืมไป Install กันด้วยนะครับ
สำหรับ Mac ใช้ Brew จะง่ายมากครับ
brew install go
จากนั้นลองใช้คำสั่งเพื่อเช็คว่าเราสามารถใช้ Go ได้จริงๆไหม แล้ว Go ที่เราใช้อยู่เป็น Version อะไร
go version
จากนั้นครับ ผมได้ทำการเปิด VS Code เพื่อจะเริ่มเขียนภาษา Go ให้ทำการสร้าง folder สำหรับโปรเจคของเราครับ
mkdir golangwithmysql
จากนั้นสร้างไฟล์ภาษา Go สำหรับเขียนโค้ดโปรเจคของเราครับ
touch main.go
จากนั้นโค้ดในไฟล์ของเราให้เพื่อนๆลองทำตามดูครับ
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/testgowithmysql")
defer db.Close()
if err != nil {
log.Fatal(err)
}
var version string
err2 := db.QueryRow("SELECT VERSION()").Scan(&version)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println(version)
}
เนื่องจากเรามีการใช้ go-sql-driver จากข้างนอกด้วย เราจึงต้องนำเข้ามาด้วยนะครับ โดยเริ่มจาก
go mod init golangwithmysql
เราจะได้ไฟล์ go.mod เพื่อจะจัดการกับ modules ต่างๆ หากเพื่อนๆที่เคยเขียน JavaScript มาก่อน จะคุ้นๆแล้วใช่ไหมครับ เพราะว่ามันมีหน้าที่คล้ายๆกับ node_modules ที่ไว้คอยจัดการกับ package ในโปรเจค JavaScript ครับ
จากนั้นเราก็จะต้อง Import module เข้ามาในโปรเจค โดยใช้คำสั่งนี้ครับ
go get github.com/go-sql-driver/mysql
เมื่อ sql driver อยู่ในโปรเจคของเราแล้ว เราก็พร้อมลุยกับการเชื่อมต่อ database ของเราแล้ว ให้ทำการใช้คำสั่งใน terminal ดังนี้
go run main.go
ถ้าของเพื่อนๆขึ้นเป็น Version ของ MySQL ที่เพื่อนๆใช้อยู่ แสดงว่ามาถูกทางแล้วครับ เพราะว่าปลายทางของสิ่งที่ต้องการในตอนนี้นั้นก็คือ Version ของ MySQL ซึ่งตัวโปรแกรมของเราจะทำการก็ต่อเมื่อเชื่อมต่อ Database ได้แล้วนั่นเอง
ดู Version แล้ว อยากสร้างบ้าง ทำไงดี
วิธีสร้างก็ไม่ยากครับ เปลี่ยนจาก Query Command ของเราเป็น Create Table แทน
โดยสิ่งที่เราต้องการในตัวอย่างนี้คือเราอยากได้ตารางสำหรับนักศึกษาหนึ่งคน โดยจะมีข้อมูลดังนี้ครับ
| Field | Type | |-------|------| | id | int (AUTO_INCREMENT) | | firstname | varchar(45) | | lastname | varchar(45) | | major | varchar(45) | | faculty | varchar(45) |
ซึ่งแปลเป็น SQL Command ก็จะประมาณนี้ครับ
CREATE TABLE IF NOT EXISTS student (
id int(11) NOT NULL AUTO_INCREMENT,
firstname varchar(45),
lastname varchar(45),
major varchar(45),
faculty varchar(45),
PRIMARY KEY (id)
);
ยาวไปหน่อย แต่คือจริงๆแล้วเราแค่เอาไปใส่แทนช่อง Query Command ในคำสั่งเราแทน SELECT VERSION() เท่านั้นเลยครับ
res, err := db.Query("CREATE TABLE IF NOT EXISTS student (id int(11) NOT NULL AUTO_INCREMENT, firstname varchar(45), lastname varchar(45), major varchar(45), faculty varchar(45), PRIMARY KEY (id))")
เอาล่ะครับ ถ้าทุกท่านทำตามมาถึงจุดนี้ได้ เราก็ผ่านกระบวนการ Create เรียบร้อยแล้วครับ
ลอง Insert Data
หลังจากที่เราได้สร้าง Table Structure ของเรามาแล้ว เราจะไปลอง Insert Data กัน
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/testgowithmysql")
defer db.Close()
if err != nil {
log.Fatal(err)
}
sql := "INSERT INTO student(firstname, lastname, major, faculty) VALUES ('John', 'Saiwick', 'IT', 'SIT')"
res, err := db.Exec(sql)
if err != nil {
panic(err.Error())
}
lastId, err := res.LastInsertId()
if err != nil {
log.Fatal(err)
}
fmt.Printf("The last inserted row id: %d\n", lastId)
}
ลองรันเพื่อ Insert ดูครับ จะเห็นว่าเราก็แค่เพิ่ม SQL Command แล้วเอาไปให้ DB ทำการ Execute ให้เรานั่นเองครับ
หากทำสำเร็จก็จะแสดง ID ของ Row ที่เราได้สร้างมาเมื่อครู่ครับ จะเห็นว่าคุณ John ใส่วิคได้มาจอยเป็นนักศึกษาแล้ว
แต่ถ้าจะให้มาเข้า MySQL Console เพื่อ Get Data มันก็จะเอาไปทำอะไรกับแอพหรือเว็บไม่ได้ใช่ไหมล่ะครับ เราไปลองดูวิธีเรียกผ่าน Go กัน
ลอง Get Data
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
type Student struct {
Id int
Firstname string
Lastname string
Major string
Faculty string
}
func main() {
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/testgowithmysql")
defer db.Close()
if err != nil {
log.Fatal(err)
}
res, err := db.Query("SELECT * FROM student")
defer res.Close()
if err != nil {
log.Fatal(err)
}
for res.Next() {
var student Student
err := res.Scan(&student.Id, &student.Firstname, &student.Lastname, &student.Major, &student.Faculty)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%v\n", student)
}
}
เราสร้าง Model ของ Student คล้ายๆกับที่เราทำให้ Table Structure เลย เหตุผลที่เราสร้าง Model มาก็เปรียบเสมือนผูกค่าใน DB กับตัวที่เราต้องการจะนำออกมาแสดงประมาณนี้เลยครับ
อันนี้ก็เป็นคร่าวๆนะครับ สำหรับภาษา Go โดยส่วนตัวผมว่าเป็นภาษานึงที่เขียนสนุกนะครับ แต่ก็ยอมรับว่า Syntax ยังดูยากๆ สลับกับที่เคยเจอในภาษาอื่นมาบ้าง แต่ก็ถ้าเทียบในมุมมองได้มาทดลองก็ดีไม่น้อยเลยครับ
ขอบคุณที่อ่านมาจนจบนะครับ
