Skip to content

MySQL

Mysql เป็นฐานข้อมูลเชิงสัมพันธ์โอเพนซอร์สที่ได้รับความนิยมมากที่สุดในปัจจุบัน บทความนี้จะไม่กล่าวถึงความรู้ sql เฉพาะเจาะจงมากเกินไป หากคุณไม่เป็นโปรดศึกษาด้วยตนเองก่อน บทความนี้อธิบายวิธีการใช้ go เพื่อดำเนินการ sql อย่างง่ายเท่านั้น โดยทั่วไปในโปรเจกต์จะไม่ใช้ไดรเวอร์เพื่อดำเนินการฐานข้อมูลโดยตรง แต่จะใช้เฟรมเวิร์ก ORM บทความนี้ใช้ไลบรารี sqlx ซึ่งเป็นการเพิ่มประสิทธิภาพให้กับไลบรารี sql มาตรฐาน ไม่มีฟังก์ชัน ORM มากมายแต่ชนะที่เรียบง่าย หากคุณต้องการใช้ ORM สามารถไปศึกษา Gorm, Xorm, Ent และไลบรารีอื่นๆ

การติดตั้ง

ดาวน์โหลดไลบรารี sqlx

bash
$ go get github.com/jmoiron/sqlx

sqlx หรือไลบรารี database/sql มาตรฐานรองรับฐานข้อมูลมากกว่า MySQL ใดๆ ที่ใช้งานอินเทอร์เฟซ driver.Driver ก็รองรับ เช่น:

  • PostgreSQL
  • Oracle
  • MariaDB
  • SQLite
  • ฐานข้อมูลเชิงสัมพันธ์อื่นๆ

หากต้องการใช้ฐานข้อมูลที่เกี่ยวข้อง จำเป็นต้องใช้งานไดรเวอร์ฐานข้อมูล ไดรเวอร์อาจเป็นที่คุณเขียนเองหรือเป็นไลบรารีบุคคลที่สาม ก่อนใช้งานคุณต้องลงทะเบียนไดรเวอร์ด้วย sql.Register ก่อนจึงจะสามารถใช้งานได้ แต่โดยทั่วไปไลบรารีไดรเวอร์ที่ดาวน์โหลดจะลงทะเบียนไดรเวอร์โดยอัตโนมัติ ไม่ต้องลงทะเบียนด้วยตนเอง

go
func Register(name string, driver driver.Driver)

เนื่องจาก MySQL ได้รับความนิยมและเรียบง่ายที่สุด บทความนี้จึงใช้ MySQL เพื่ออธิบาย การดำเนินการฐานข้อมูลเชิงสัมพันธ์อื่นๆ ไม่แตกต่างกันมาก ดาวน์โหลดไลบรารีไดรเวอร์ MySQL

bash
$ go get github.com/go-sql-driver/mysql

การเชื่อมต่อกับฐานข้อมูล

ผ่านฟังก์ชัน sqlx.Open สามารถเปิดการเชื่อมต่อฐานข้อมูลได้ มันรับพารามิเตอร์สองตัว ตัวแรกคือชื่อไดรเวอร์ ตัวที่สองคือแหล่งข้อมูล (โดยทั่วไปเรียกสั้นๆ ว่า DSN)

go
func Open(driverName, dataSourceName string) (*DB, error)

ชื่อไดรเวอร์คือชื่อที่ใช้เมื่อลงทะเบียนไดรเวอร์ ต้อง保持一致 DSN คือที่อยู่การเชื่อมต่อฐานข้อมูล แต่ละฐานข้อมูลอาจแตกต่างกัน สำหรับ MySQL คือด้านล่างนี้

go
db,err := sqlx.Open("mysql","root:123456@tcp(127.0.0.1:3306)/test")

การเตรียมข้อมูล

sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
  `age` tinyint(0) NULL DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('12132', '张三', 35, '北京市');
INSERT INTO `user` VALUES ('16162', '王五', 22, '上海市');

SET FOREIGN_KEY_CHECKS = 1;

การค้นหา

ค้นหา และแมปผลลัพธ์ไปยังโครงสร้าง

go
var db *sqlx.DB

type Person struct {
   UserId   string `db:"id"`
   Username string `db:"name"`
   Age      int    `db:"age"`
   Address  string `db:"address"`
}

func init() {
    conn, err := sqlx.Open("mysql", "root:wyh246859@tcp(127.0.0.1:3306)/test")
   if err != nil {
      fmt.Println("Open mysql failed", err)
      return
   }

   db = conn
}

func main() {
   query()
   defer db.Close()
}

func query() {
   var person Person
   // การค้นหาเดียวคือ Get หลายรายการคือ Select
   err := db.Get(&person, "select * from user where id = ?", "12132")
   if err != nil {
      fmt.Println("query failed:", err)
      return
   }
   fmt.Printf("query succ:%+v", person)
}

func list() {
  var perons []Person
  err := db.Select(&perons, "select * from user")
  if err != nil {
    fmt.Println("list err", err)
    return
  }
  fmt.Printf("list succ,%+v", perons)
}

การเพิ่ม

เพิ่มข้อมูล

go
func insert() {
   result, err := db.Exec("insert into user value (?,?,?,?)", "120230", "李四", 12, "广州市")
   if err != nil {
      fmt.Println("insert err:", err)
      return
   }
   id, err := result.LastInsertId()
   if err != nil {
      fmt.Println("insert err:", err)
      return
   }
   fmt.Println("insert succ:", id)
}

การอัปเดต

อัปเดตข้อมูล

go
func update() {
   res, err := db.Exec("update user set name = ? where id = ?", "赵六", "120230")
   if err != nil {
      fmt.Println("update err:", err)
      return
   }
   eff, err := res.RowsAffected()
   if err != nil || eff == 0 {
      fmt.Println("update err:", err)
      return
   }
   fmt.Println("Update succ")
}

การลบ

ลบข้อมูล

go
func delete() {
   res, err := db.Exec("delete from user where id = ?", "120230")
   if err != nil {
      fmt.Println("delete err:", err)
      return
   }
   eff, err := res.RowsAffected()
   if err != nil || eff == 0 {
      fmt.Println("delete err:", err)
      return
   }
   fmt.Println("delete succ")
}

ธุรกรรม

go
func (db *DB) Begin() (*Tx, error) // เริ่มธุรกรรม
func (tx *Tx) Commit() error // ยืนยันธุรกรรม
func (tx *Tx) Rollback() error // ยกเลิกธุรกรรม

เมื่อเริ่มธุรกรรมแล้ว เพื่อความปลอดภัยมักจะเพิ่ม defer tx.Rollback() หากกระบวนการเกิดข้อผิดพลาดจะยกเลิก หากธุรกรรมยืนยันสำเร็จ การยกเลิกนี้ย่อมเป็นโมฆะ

go
func main() {

  transation, err := db.Begin()
  if err != nil {
    fmt.Println("transation err")
  }
    defer transation.Rollback()

  insert()
  query()
  update()
  query()
  delete()
   transation.Commit()
}

Golang by www.golangdev.cn edit