ติดต่อฐานข้อมูล MySQL
ถ้าเราเขียนโปรแกรมเพื่อช่วยให้เราทำงานสะดวกสะบายขึ้นปฏิเสธไม่ได้ว่าเราต้องมีการเก็บข้อมมูลบางอย่าง ในบทความนี้ เป็นการพัฒนาโปรแกรมด้วยภาษา Go ที่มีการบันทึกข้อมูลบนไฟล์ฐานข้อมูล MySQL โดย ใช้ XAMPP จำลองเป็น WebServer และ phpMyAdmin เป็นตัวสร้าง Database เริ่มด้วยการติดตั้งและสร้าง Table สำหรับในการเก็บข้อมูล ในบทความนี้จะใช้ชื่อ Table เป็น member ที่มีการเก็บข้อมูล Username และ Password รวมทั้งสถานะว่าเป็น User หรือว่า Admin
ข้อกำหนดเบื้องต้น
ข้อกำหนดสำหรับบทความนี้คือ คุณต้องติดตั้ง Go บนคอมพิวเตอร์ของคุณและเคยเรียนรู้บทความ สร้าง ทำ Web โปรแกรมแรก Hello, World มาก่อน
ติดตั้ง XAMPP
วิธีการจำลอง ให้คอมพิวเตอร์ของเราสามารถทำตัวเองเป็น WebServer เพื่อทดสอบ การพัฒนาโปรแกรม
ทำการดาวน์โหลด XMAPP https://www.apachefriends.org/index.html เลือกตามระบบปฏิการของคุณ (ในตัวอย่างใช้ระบบปฏิบัตการ Windows) แล้วติดตั้งตามขั้นตอนที่แนะนำ
ทำการเลือก Components ที่เราต้องการ สามารถเลือกทั้งหมดได้ แต่สำหรับตอนนี้ใช้แค่ Apache / MySQL เลยเลือกแค่นี้
หลังจากทำการติดตั้งเรียบร้อย ให้ทำการ Restart Computer 1 ครั้ง
เปิด XAMPP จากนั้นเข้า Control Panel ของ XAMPP และทำการคลิก Start Apache และ Mysql ตามลำดับ
สร้างฐานข้อมูล
จากนั้นเข้า Phpmyadmin http://localhost/phpmyadmin จากนั้นคลิกที่ New
ตั้งชื่อไฟล์ฐานข้อมุลในตัวอย่าง เป็น data1 -> Create
ไปที่ SQL
เกี่ยวกับตารางจะประกอบด้วย UserID , Username , Password , Name , Status โดยช่อง Status เป็นตัวประบุว่าเป็น ADMIN หรือว่า User
เขียนโค้ดดังนี้
CREATE TABLE `member` (
`UserID` int(3) unsigned zerofill NOT NULL auto_increment,
`Username` varchar(20) NOT NULL,
`Password` varchar(20) NOT NULL,
`Name` varchar(100) NOT NULL,
`Status` enum('ADMIN','USER') NOT NULL default 'USER',
PRIMARY KEY (`UserID`),
UNIQUE KEY `Username` (`Username`)
) ENGINE=MyISAM AUTO_INCREMENT=3 ;
--
-- Dumping data for table `member`
--
INSERT INTO `member` VALUES (001, 'win', 'win123', 'Weerachai Nukitram', 'USER');
INSERT INTO `member` VALUES (002, 'chai', 'chai123', 'Surachai Sirisart', 'ADMIN');
คลิกที่ Go
สังเกตจะมี Table ชื่อ member เพิ่มเข้ามา
ไปที่ member จะพบ ข้อมูลที่เราเพิ่มขั้นต้นด้วยโค้ด แสดงว่า การสร้างไฟล์ฐานข้อมูล ของคุณสำเร็จแล้ว
ติดตั้ง Go-MySQL-Driver
เมื่อเราสร้าง Database เสร็จเราก็มาเขียน GO เชื่อมไปยัง MySQL กัน ในบทความนี้จะใช้ Library ของ GO ชื่อว่า go-sql-driver/mysql
Go-MySQL-Driver https://pkg.go.dev/github.com/go-sql-driver/mysql
get package go-sql-driver/mysql มาจาก Github ก่อน ด้วยคำสั่ง
go get github.com/go-sql-driver/mysql
ถ้าเข้าไปดูที่ไฟล์ go.mod จะพบ require github.com/go-sql-driver/mysql v1.6.0 เพิ่มเข้ามา
ติดต่อ ฐานข้อมูล MySQL
ที่ไฟล์ main.go เขียนโค้ดดังนี้
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root:@/data1")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err)
}
}
คอมไพล์ไฟล์ซอร์ส go build แล้ว เรียกใช้งาน โดยใช้คำสั่ง ./web
ถ้าติดต่อฐานข้อมูลไม่ได้ จะแสดง ข้อผิดพลาด
ถ้าติดต่อฐานข้อมูลได้ จะไม่แสดง ข้อผิดพลาด ใดๆ
อ่านข้อมูล
การอ่านข้อมูล จากฐานข้อมูล ให้เพิ่มโค้ดดังนี้
query := "select UserID , Username , Password , Name , Status from member"
rows , err := db.Query(query)
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
UserID := 0
Username := ""
Password := ""
Name := ""
Status := ""
err := rows.Scan(&UserID , &Username , &Password , &Name , &Status )
if err != nil {
panic(err)
}
println(UserID, Username , Password , Name , Status)
}
โค้ดทั้งหมด
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root:@/data1")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err)
}
query := "select UserID , Username , Password , Name , Status from member"
rows , err := db.Query(query)
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
UserID := 0
Username := ""
Password := ""
Name := ""
Status := ""
err := rows.Scan(&UserID , &Username , &Password , &Name , &Status)
if err != nil {
panic(err)
}
println(UserID, Username , Password , Name , Status)
}
}
เมื่อทดสอบการทำงาน จะอ่านข้อมูลทั้งหมด ซึ่งตอนนี้ที่เราเพิ่มไว้ล่วงหน้า คือ 1 win และ 2 chai
Insert เพิ่มข้อมูล
การ เพิ่มข้อมูล ให้ฐานข้อมูล ให้เพิ่มโค้ดดังนี้
sql := "INSERT INTO member(Username , Password , Name , Status) VALUES ('wiy' , 'wiy123' , 'Wiyada Amarin' , 'USER')"
res, err := db.Exec(sql)
if err != nil {
panic(err)
}
lastId, err := res.LastInsertId()
if err != nil {
panic(err)
}
println("The last inserted row id:", lastId)
โค้ดทั้งหมด
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root:@/data1")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err)
}
sql := "INSERT INTO member(Username , Password , Name , Status) VALUES ('wiy' , 'wiy123' , 'Wiyada Amarin' , 'USER')"
res, err := db.Exec(sql)
if err != nil {
panic(err)
}
lastId, err := res.LastInsertId()
if err != nil {
panic(err)
}
println("The last inserted row id:", lastId)
query := "select UserID , Username , Password , Name , Status from member"
rows , err := db.Query(query)
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
UserID := 0
Username := ""
Password := ""
Name := ""
Status := ""
err := rows.Scan(&UserID , &Username , &Password , &Name , &Status)
if err != nil {
panic(err)
}
println(UserID, Username , Password , Name , Status)
}
}
เมื่อทดสอบการทำงาน จะเพิ่มข้อมูล 3 wiy เข้ามา
Delete ลบข้อมูล
การ ลบข้อมูล ในฐานข้อมูล ให้เพิ่มโค้ดดังนี้
sql := "DELETE FROM member WHERE UserID IN (2)"
res, err := db.Exec(sql)
if err != nil {
panic(err)
}
affectedRows, err := res.RowsAffected()
if err != nil {
panic(err)
}
println("The statement affected row:", affectedRows)
โค้ดทั้งหมด
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root:@/data1")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err)
}
sql := "DELETE FROM member WHERE UserID IN (2)"
res, err := db.Exec(sql)
if err != nil {
panic(err)
}
affectedRows, err := res.RowsAffected()
if err != nil {
panic(err)
}
println("The statement affected row:", affectedRows)
query := "select UserID , Username , Password , Name , Status from member"
rows , err := db.Query(query)
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
UserID := 0
Username := ""
Password := ""
Name := ""
Status := ""
err := rows.Scan(&UserID , &Username , &Password , &Name , &Status)
if err != nil {
panic(err)
}
println(UserID, Username , Password , Name , Status)
}
}
เมื่อทดสอบการทำงาน จะลบข้อมูล UserID ที่ 2 ออกไป
Edit แก้ไขข้อมูล
การ แก้ไขข้อมูล ในฐานข้อมูล ให้เพิ่มโค้ดดังนี้
sql := "UPDATE member SET Password = 'ner456' WHERE UserID = 1"
res, err := db.Exec(sql)
if err != nil {
panic(err)
}
affectedRows, err := res.RowsAffected()
if err != nil {
panic(err)
}
println("The statement affected row:", affectedRows)
โค้ดทั้งหมด
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root:@/data1")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err)
}
sql := "UPDATE member SET Password = 'ner456' WHERE UserID = 1"
res, err := db.Exec(sql)
if err != nil {
panic(err)
}
affectedRows, err := res.RowsAffected()
if err != nil {
panic(err)
}
println("The statement affected row:", affectedRows)
query := "select UserID , Username , Password , Name , Status from member"
rows , err := db.Query(query)
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
UserID := 0
Username := ""
Password := ""
Name := ""
Status := ""
err := rows.Scan(&UserID , &Username , &Password , &Name , &Status)
if err != nil {
panic(err)
}
println(UserID, Username , Password , Name , Status)
}
}
เมื่อทดสอบการทำงาน Password ของ UserID 1 ชื่อ win เปลี่ยนจาก win123 เป็น ner456
จัดการฐานข้อมูล แบบออบเจ็กต์
Query อ่านข้อมูล
การอ่านข้อมูล จากฐานข้อมูล เขียนโค้ดดังนี้
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
type Member struct {
UserID int
Username string
}
var db *sql.DB
func main() {
var err error
db, err = sql.Open("mysql", "root:@/data1")
if err != nil {
panic(err)
}
members, err := GetMembers()
if err != nil {
fmt.Println(err)
return
}
for _, member := range members{
fmt.Println(member)
}
}
func GetMembers() ([]Member , error) {
err := db.Ping()
if err != nil {
return nil, err
}
defer db.Close()
query := "select UserID , Username from member"
rows , err := db.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
members := []Member{}
for rows.Next() {
member := Member{}
err = rows.Scan(&member.UserID , &member.Username)
if err != nil {
return nil, err
}
members = append(members, member)
}
return members, nil
}
Query ข้อมูลที่ต้องการ
การ Query ข้อมูลที่ต้องการ จากฐานข้อมูล เขียนโค้ดดังนี้
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
type Member struct {
UserID int
Username string
}
var db *sql.DB
func main() {
var err error
db, err = sql.Open("mysql", "root:@/data1")
if err != nil {
panic(err)
}
member, err := GetMember(1)
if err != nil {
panic(err)
}
fmt.Println(member)
}
func GetMember(UserID int) (*Member, error) {
err := db.Ping()
if err != nil {
return nil, err
}
query := "select UserID, Username from member where UserID=?"
row := db.QueryRow(query, UserID)
member := Member{}
err = row.Scan(&member.UserID, &member.Username)
if err != nil {
return nil, err
}
return &member, nil
}