Go 語言操作 MySQL 數據庫

Go 語言操作 MySQL 數據庫

起步

  • 首先需要引入一個驅動,在命令行使用 go get 引入即可:

    go get github.com/go-sql-driver/mysql
    
  • 然後在 import 的時候,只需要該驅動的 init() 函數,所以可以在該驅動前加 _

  • 最後使用 database/sql 來操作數據庫

    import (
    	"database/sql"
    	"fmt"
    	_ "github.com/go-sql-driver/mysql"
    )
    

操作

完整代碼如下,其中需要一些函數,理解記住就好。

/*
@Time : 2019-11-6 下午 3:04
@Author : Gerald
@File : CURD.go
@Software: GoLand
*/
package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

type student struct {
	id   int
	name string
	sex  string
	age  int
}

// 插入數據
func insertInfo(DB *sql.DB) {
	stmt, prepareErr := DB.Prepare("insert into students(name, sex, age) values(?, ?, ?)")
	if prepareErr != nil {
		fmt.Println("prepare insert query error : ", prepareErr)
		return
	}

	// 將信息寫入數據庫
	result, execErr := stmt.Exec("apple", "female", 18)
	if execErr != nil {
		fmt.Println("exec error : ", execErr)
		return
	}

	// 返回值 id 爲,上面的操作,影響了幾行
	id, rowsAffectedErr := result.RowsAffected()
	if rowsAffectedErr != nil {
		fmt.Println("insert faild : ", rowsAffectedErr)
		return
	}

	fmt.Println("affected row is ", id)
}

// 更新數據
func UpdateInfo(DB *sql.DB) {
	// 先做準備
	stmt, prepareErr := DB.Prepare("update students set name=?, sex=?, age=? where id=?")
	if prepareErr != nil {
		fmt.Println("prepare update error : ", prepareErr)
		return
	}

	// 再實際更新
	result, execErr := stmt.Exec("lili", "female", 17, 3)
	if execErr != nil {
		fmt.Println("exec update error : ", execErr)
		return
	}

	// 再打印影響行數
	id, affectedErr := result.RowsAffected()
	if affectedErr != nil {
		fmt.Println("affected row error : ", affectedErr)
		return
	}

	fmt.Println("affect row is ", id)
}

// 刪除數據
func DeleteInfo(DB *sql.DB) {
	stmt, prepareErr := DB.Prepare("delete from students where id=? or id=?")
	if prepareErr != nil {
		fmt.Println("prepare delete failed, error : ", prepareErr)
		return
	}

	result, execErr := stmt.Exec(2, 3)
	if execErr != nil {
		fmt.Println("delete failed, error : ", execErr)
		return
	}

	id, affectedErr := result.RowsAffected()
	if affectedErr != nil {
		fmt.Println("get affected row failed, error : ", affectedErr)
		return
	}

	fmt.Println("delete affect row is ", id)

}

// 單行查詢
func QueryOne(DB *sql.DB) {
	student := new(student)
	row := DB.QueryRow("select * from students where id=?", 1)
	if scanErr := row.Scan(&student.id, &student.name, &student.sex, &student.age); scanErr != nil {
		fmt.Println("scan error : ", scanErr)
		return
	}

	fmt.Println(*student)
}

// 多行查詢
func QueryMutil(DB *sql.DB) {
	student := new(student)
	rows, queryErr := DB.Query("select * from students where id>?", 1)
	// 寫一個 defer 函數,如果最後 rows 沒有顯示完,就關閉 row
	// 主要是 如果發生錯誤,就把已經加載進來的關閉掉,防止內存泄漏
	defer func() {
		if rows != nil {
			rows.Close()
		}
	}()
	// 錯誤檢查
	if queryErr != nil {
		fmt.Println("query mutil failed, error : ", queryErr)
		return
	}

	for rows.Next() {
		if scanErr := rows.Scan(&student.id, &student.name, &student.sex, &student.age); scanErr != nil {
			fmt.Println("scan failed, error : ", scanErr)
			return
		}

		fmt.Println(*student)
	}
}

func main() {
	// 定義一組 const 變量,準備連接數據庫
	const (
		USERNAME string = "root"
		PASSWORD string = "peiban493."
		NETWORK  string = "tcp"
		SERVER   string = "localhost"
		PORT     int    = 3306
		DATABASE string = "test"
		CHARSET  string = "charset=utf8"
	)
	dsn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s?%s", USERNAME, PASSWORD, NETWORK, SERVER, PORT, DATABASE, CHARSET)

	// 連接數據庫
	DB, openErr := sql.Open("mysql", dsn)
	if openErr != nil {
		fmt.Println("open mysql err : ", openErr)
		return
	}

	// insertInfo(DB)
	// UpdateInfo(DB)
	// DeleteInfo(DB)
	// QueryOne(DB)
	QueryMutil(DB)
}

發佈了103 篇原創文章 · 獲贊 42 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章