MySQL
Mysql เป็นฐานข้อมูลเชิงสัมพันธ์โอเพนซอร์สที่ได้รับความนิยมมากที่สุดในปัจจุบัน บทความนี้จะไม่กล่าวถึงความรู้ sql เฉพาะเจาะจงมากเกินไป หากคุณไม่เป็นโปรดศึกษาด้วยตนเองก่อน บทความนี้อธิบายวิธีการใช้ go เพื่อดำเนินการ sql อย่างง่ายเท่านั้น โดยทั่วไปในโปรเจกต์จะไม่ใช้ไดรเวอร์เพื่อดำเนินการฐานข้อมูลโดยตรง แต่จะใช้เฟรมเวิร์ก ORM บทความนี้ใช้ไลบรารี sqlx ซึ่งเป็นการเพิ่มประสิทธิภาพให้กับไลบรารี sql มาตรฐาน ไม่มีฟังก์ชัน ORM มากมายแต่ชนะที่เรียบง่าย หากคุณต้องการใช้ ORM สามารถไปศึกษา Gorm, Xorm, Ent และไลบรารีอื่นๆ
การติดตั้ง
ดาวน์โหลดไลบรารี sqlx
$ go get github.com/jmoiron/sqlxsqlx หรือไลบรารี database/sql มาตรฐานรองรับฐานข้อมูลมากกว่า MySQL ใดๆ ที่ใช้งานอินเทอร์เฟซ driver.Driver ก็รองรับ เช่น:
- PostgreSQL
- Oracle
- MariaDB
- SQLite
- ฐานข้อมูลเชิงสัมพันธ์อื่นๆ
หากต้องการใช้ฐานข้อมูลที่เกี่ยวข้อง จำเป็นต้องใช้งานไดรเวอร์ฐานข้อมูล ไดรเวอร์อาจเป็นที่คุณเขียนเองหรือเป็นไลบรารีบุคคลที่สาม ก่อนใช้งานคุณต้องลงทะเบียนไดรเวอร์ด้วย sql.Register ก่อนจึงจะสามารถใช้งานได้ แต่โดยทั่วไปไลบรารีไดรเวอร์ที่ดาวน์โหลดจะลงทะเบียนไดรเวอร์โดยอัตโนมัติ ไม่ต้องลงทะเบียนด้วยตนเอง
func Register(name string, driver driver.Driver)เนื่องจาก MySQL ได้รับความนิยมและเรียบง่ายที่สุด บทความนี้จึงใช้ MySQL เพื่ออธิบาย การดำเนินการฐานข้อมูลเชิงสัมพันธ์อื่นๆ ไม่แตกต่างกันมาก ดาวน์โหลดไลบรารีไดรเวอร์ MySQL
$ go get github.com/go-sql-driver/mysqlการเชื่อมต่อกับฐานข้อมูล
ผ่านฟังก์ชัน sqlx.Open สามารถเปิดการเชื่อมต่อฐานข้อมูลได้ มันรับพารามิเตอร์สองตัว ตัวแรกคือชื่อไดรเวอร์ ตัวที่สองคือแหล่งข้อมูล (โดยทั่วไปเรียกสั้นๆ ว่า DSN)
func Open(driverName, dataSourceName string) (*DB, error)ชื่อไดรเวอร์คือชื่อที่ใช้เมื่อลงทะเบียนไดรเวอร์ ต้อง保持一致 DSN คือที่อยู่การเชื่อมต่อฐานข้อมูล แต่ละฐานข้อมูลอาจแตกต่างกัน สำหรับ MySQL คือด้านล่างนี้
db,err := sqlx.Open("mysql","root:123456@tcp(127.0.0.1:3306)/test")การเตรียมข้อมูล
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;การค้นหา
ค้นหา และแมปผลลัพธ์ไปยังโครงสร้าง
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)
}การเพิ่ม
เพิ่มข้อมูล
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)
}การอัปเดต
อัปเดตข้อมูล
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")
}การลบ
ลบข้อมูล
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")
}ธุรกรรม
func (db *DB) Begin() (*Tx, error) // เริ่มธุรกรรม
func (tx *Tx) Commit() error // ยืนยันธุรกรรม
func (tx *Tx) Rollback() error // ยกเลิกธุรกรรมเมื่อเริ่มธุรกรรมแล้ว เพื่อความปลอดภัยมักจะเพิ่ม defer tx.Rollback() หากกระบวนการเกิดข้อผิดพลาดจะยกเลิก หากธุรกรรมยืนยันสำเร็จ การยกเลิกนี้ย่อมเป็นโมฆะ
func main() {
transation, err := db.Begin()
if err != nil {
fmt.Println("transation err")
}
defer transation.Rollback()
insert()
query()
update()
query()
delete()
transation.Commit()
}