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