Skip to content

MySQL

MySQL adalah database relasional open source paling populer saat ini. Pengetahuan SQL spesifik tidak akan dijelaskan secara rinci di sini. Jika Anda belum menguasainya, silakan pelajari terlebih dahulu. Artikel ini hanya menjelaskan secara singkat cara menggunakan Go untuk melakukan operasi SQL. Dalam proyek, umumnya Anda tidak akan menggunakan driver secara langsung untuk melakukan operasi database, melainkan menggunakan kerangka ORM. Di sini digunakan pustaka sqlx, yang merupakan peningkatan dari pustaka sql standar, tidak sebanyak fungsi ORM tetapi keunggulannya adalah kesederhanaan. Jika Anda ingin menggunakan ORM, Anda dapat mempelajari pustaka seperti Gorm, Xorm, Ent.

Dependensi

Unduh pustaka sqlx

bash
$ go get github.com/jmoiron/sqlx

sqlx atau pustaka standar database/sql mendukung tidak hanya MySQL, tetapi juga database apa pun yang mengimplementasikan antarmuka driver.Driver, seperti:

  • PostgreSQL
  • Oracle
  • MariaDB
  • SQLite
  • Dan database relasional lainnya

Untuk menggunakan database yang sesuai, Anda perlu mengimplementasikan driver database. Driver dapat ditulis sendiri atau dari pustaka pihak ketiga. Sebelum digunakan, Anda harus mendaftarkan driver menggunakan sql.Register, baru kemudian dapat digunakan. Namun, umumnya pustaka driver yang diunduh akan mendaftarkan driver secara otomatis, tidak perlu Anda daftarkan secara manual.

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

Karena MySQL cukup populer dan paling sederhana, artikel ini menggunakan MySQL untuk penjelasan. Operasi database relasional lainnya hampir sama. Unduh pustaka driver MySQL

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

Terhubung ke Database

Melalui fungsi sqlx.Open, Anda dapat membuka koneksi database. Fungsi ini menerima dua parameter, yang pertama adalah nama driver, yang kedua adalah sumber data (umumnya disebut DSN).

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

Nama driver adalah nama yang digunakan saat mendaftarkan driver, harus konsisten. DSN adalah alamat koneksi database, yang mungkin berbeda untuk setiap database. Untuk MySQL, bentuknya seperti berikut

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

Menyiapkan Data

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;

Kueri

Kueri, dan memetakan hasilnya ke dalam struct

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
   // Satu adalah Get, banyak adalah 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)
}

Menyisipkan

Menyisipkan data

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)
}

Memperbarui

Memperbarui data

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")
}

Menghapus

Menghapus data

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")
}

Transaksi

go
func (db *DB) Begin() (*Tx, error) // Memulai transaksi
func (tx *Tx) Commit() error // Men-commit transaksi
func (tx *Tx) Rollback() error // Rollback transaksi

Setelah memulai transaksi, untuk keamanan biasanya ditambahkan defer tx.Rollback(). Jika terjadi kesalahan selama proses, akan dilakukan rollback. Jika transaksi berhasil di-commit, rollback ini tentu saja tidak berlaku.

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