1. 程式人生 > 實用技巧 >Go語言實現MySQL連線和增刪查改操作

Go語言實現MySQL連線和增刪查改操作

Go語言實現MySQL連線和增刪查改操作

1、mysql資料庫驅動安裝

go語言連線資料庫的驅動是:go-sql-driver,在使用mysql之前要下載驅動

開啟命令列輸入

go get -u github.com/go-sql-driver/mysql

2、建立資料庫表

下文例項中的資料庫表SQL檔案:

CREATE TABLE `stu_info` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `addr` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3、mysql資料庫連線

構建連線, 格式是:”使用者名稱:密碼@tcp(IP:埠)/資料庫?charset=utf8”

具體增刪查改操作看下文例子

package main

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

type Student struct {
	Id int32
	Name string
	Age int32
	Addr string
}

//資料庫配置
const (
	userName = "root"
	password = "xxw2020"
	ip = "127.0.0.1"
	port = "3306"
	dbName = "student"
)
//Db資料庫連線池
var DB *sql.DB

//注意方法名大寫,就是public
func InitDB()  {
	//構建連線:"使用者名稱:密碼@tcp(IP:埠)/資料庫?charset=utf8"
	path := strings.Join([]string{userName, ":", password, "@tcp(",ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
	fmt.Println(path)
	//開啟資料庫,前者是驅動名,所以要匯入: _ "github.com/go-sql-driver/mysql"
	DB, _ = sql.Open("mysql", path)
	if DB == nil {
		fmt.Println("連線失敗!")
		return
	}
	//設定資料庫最大連線數
	DB.SetConnMaxLifetime(10)
	//設定上資料庫最大閒置連線數
	DB.SetMaxIdleConns(5)
	//驗證連線
	if err := DB.Ping(); err != nil{
		fmt.Println("opon database fail")
		return
	}
	fmt.Println("connnect success")
}

func InsertStu(user Student) (bool){
	//開啟事務
	tx, err := DB.Begin()
	if err != nil{
		fmt.Println("tx fail")
		return false
	}
	//準備sql語句
	stmt, err := tx.Prepare("INSERT INTO stu_info (`id`,`name`,`age`, `addr`) VALUES (?, ?, ?, ?)")
	if err != nil{
		fmt.Println("Prepare fail")
		return false
	}
	//將引數傳遞到sql語句中並且執行
	res, err := stmt.Exec(user.Id, user.Name, user.Age, user.Addr)
	if err != nil{
		fmt.Println("Exec fail")
		return false
	}
	//將事務提交
	tx.Commit()
	//獲得上一個插入自增的id
	fmt.Println(res.LastInsertId())
	return true
}
//刪除使用者
func DeleteStu(userId int32) (bool) {
	//開啟事務
	tx, err := DB.Begin()
	if err != nil{
		fmt.Println("tx fail")
	}
	//準備sql語句
	stmt, err := tx.Prepare("DELETE FROM stu_info WHERE id = ?")
	if err != nil{
		fmt.Println("Prepare fail")
		return false
	}
	//設定引數以及執行sql語句
	res, err := stmt.Exec(userId)
	if err != nil{
		fmt.Println("Exec fail")
		return false
	}
	//提交事務
	tx.Commit()
	//獲得上一個insert的id
	fmt.Println(res.LastInsertId())
	return true
}

//更新資料
func UpdateStu(stu Student) (bool) {
	//開啟事務
	tx, err := DB.Begin()
	if err != nil{
		fmt.Println("tx fail")
	}
	//準備sql語句
	stmt, err := tx.Prepare("UPDATE stu_info SET name = ?, age = ? WHERE id = ?")
	if err != nil{
		fmt.Println("Prepare fail")
		return false
	}
	//設定引數以及執行sql語句
	res, err := stmt.Exec(stu.Name, stu.Age, stu.Id)
	if err != nil{
		fmt.Println("Exec fail")
		return false
	}
	//提交事務
	tx.Commit()
	fmt.Println(res.LastInsertId())
	return true
}

//查詢一行資料
func SelectStuById(id int) (Student) {
	var stu Student
	err := DB.QueryRow("SELECT * FROM stu_info WHERE id = ?", id).Scan(&stu.Id, &stu.Name, &stu.Age, &stu.Addr)
	if err != nil{
		fmt.Println("查詢出錯了")
	}
	return stu
}

//查詢多行資料
func SelectAllStu() ([]Student) {
	//執行查詢語句
	rows, err := DB.Query("SELECT * from stu_info")
	if err != nil{
		fmt.Println("查詢出錯了")
	}
	var stus []Student
	//迴圈讀取結果
	for rows.Next(){
		var stu Student
		//將每一行的結果都賦值到一個user物件中
		err := rows.Scan(&stu.Id, &stu.Name, &stu.Age, &stu.Addr)
		if err != nil {
			fmt.Println("rows fail")
		}
		//將user追加到users的這個陣列中
		stus = append(stus, stu)
	}
	return stus
}

func main() {
	InitDB()
	stu := Student{
		Id: 3,
		Name: "xxw",
		Age: 20,
		Addr: "北京",
	}
	fmt.Println(stu)
	//InsertStu(stu) //註釋的操作自己選擇進行。
	//DeleteStu(4)
	//UpdateStu(stu)
	//stutemp := SelectStuById(1)
	//fmt.Println(stutemp)
	stus := SelectAllStu()
	fmt.Println(stus)
}

多動手最好自己手寫一遍。