ติดต่อฐานข้อมูล 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 
}

Leave a Reply

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