Go語(yǔ)言操作MySql數(shù)據(jù)庫(kù)的詳細(xì)指南
前言
go-sql-driver/mysql庫(kù)是Go語(yǔ)言官方推薦的MySQL驅(qū)動(dòng)庫(kù),可以很方便地實(shí)現(xiàn)對(duì)MySQL數(shù)據(jù)庫(kù)的連接和操作。本文記錄一下使用go-sql-driver/mysql數(shù)據(jù)庫(kù)驅(qū)動(dòng)來(lái)操作mysql數(shù)據(jù)庫(kù)。
1.安裝驅(qū)動(dòng)程序
go get -u github.com/go-sql-driver/mysql
2.導(dǎo)入驅(qū)動(dòng)包
_ "github.com/go-sql-driver/mysql"
說(shuō)明:當(dāng)導(dǎo)入帶有空白標(biāo)識(shí)符前綴 _ 的包時(shí),將調(diào)用包的 init 函數(shù)。該函數(shù)注冊(cè)驅(qū)動(dòng)程序
3.操作數(shù)據(jù)庫(kù)
3.1 獲取mysql版本
func showMysqlVersion() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("數(shù)據(jù)庫(kù)連接失??!")
log.Fatalln(err)
}
var version string
err2 := db.QueryRow("SELECT VERSION()").Scan(&version)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println(version)
}3.2 創(chuàng)建表
func createTable() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
_, err2 := db.Exec("CREATE TABLE user(id INT NOT NULL , name VARCHAR(20), PRIMARY KEY(ID));")
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("successfully create table")
}3.3 表中插入數(shù)據(jù)
func insertItem() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
_, err2 := db.Query("INSERT INTO user VALUES(1, 'zhangsan')")
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("successfully insert item")
}3.4 表中刪除數(shù)據(jù)
func deleteItem() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
sql := "DELETE FROM user WHERE id = 1"
res, err2 := db.Exec(sql)
if err2 != nil {
panic(err2.Error())
}
affectedRows, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Printf("delete item success, statement affected %d rows\n", affectedRows)
}
3.5 修改表中數(shù)據(jù)
func alterItem() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
sql := "update user set name = ? WHERE id = ?"
res, err2 := db.Exec(sql, "lisi", 1)
if err2 != nil {
panic(err2.Error())
}
affectedRows, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Printf("alter item success, statement affected %d rows\n", affectedRows)
}3.6 查詢表中數(shù)據(jù)
func queryItem() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
var mid int = 1
result, err2 := db.Query("SELECT * FROM user WHERE id = ?", mid)
if err2 != nil {
log.Fatal(err2)
}
for result.Next() {
var id int
var name string
err = result.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %d, name: %s\n", id, name)
}
}
3.7 刪除表
func dropTable() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
_, err2 := db.Exec("DROP TABLE user;")
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("successfully drop table")
}4.綜合演示
完整代碼如下:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func showMysqlVersion() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("數(shù)據(jù)庫(kù)連接失敗!")
log.Fatalln(err)
}
var version string
err2 := db.QueryRow("SELECT VERSION()").Scan(&version)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println(version)
}
func createTable() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
_, err2 := db.Exec("CREATE TABLE user(id INT NOT NULL , name VARCHAR(20), PRIMARY KEY(ID));")
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("successfully create table")
}
func insertItem() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
_, err2 := db.Query("INSERT INTO user VALUES(1, 'zhangsan')")
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("successfully insert item")
}
func deleteItem() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
sql := "DELETE FROM user WHERE id = 1"
res, err2 := db.Exec(sql)
if err2 != nil {
panic(err2.Error())
}
affectedRows, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Printf("delete item success, statement affected %d rows\n", affectedRows)
}
func alterItem() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
sql := "update user set name = ? WHERE id = ?"
res, err2 := db.Exec(sql, "lisi", 1)
if err2 != nil {
panic(err2.Error())
}
affectedRows, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Printf("alter item success, statement affected %d rows\n", affectedRows)
}
func queryItem() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB?charset=utf8mb4")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
var mid int = 1
result, err2 := db.Query("SELECT * FROM user WHERE id = ?", mid)
if err2 != nil {
log.Fatal(err2)
}
for result.Next() {
var id int
var name string
err = result.Scan(&id, &name)
if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %d, name: %s\n", id, name)
}
}
func dropTable() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:3306)/TestDB")
db.Ping()
defer db.Close()
if err != nil {
fmt.Println("connect DB error !")
log.Fatalln(err)
}
_, err2 := db.Exec("DROP TABLE user;")
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("successfully drop table")
}
func main() {
showMysqlVersion()
createTable()
insertItem()
queryItem()
alterItem()
queryItem()
deleteItem()
dropTable()
}
運(yùn)行效果:
go mod init mysql-test.go
go build mysql-test.go
./mysql-test

代碼結(jié)構(gòu):

總結(jié)
到此這篇關(guān)于Go語(yǔ)言操作MySql數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)Go操作MySql數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go 語(yǔ)言json.Unmarshal 遇到的小問(wèn)題(推薦)
這篇文章主要介紹了 Go 語(yǔ)言json.Unmarshal 遇到的小問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
go語(yǔ)言實(shí)現(xiàn)http服務(wù)端與客戶端的例子
今天小編就為大家分享一篇go語(yǔ)言實(shí)現(xiàn)http服務(wù)端與客戶端的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Go語(yǔ)言中動(dòng)態(tài)調(diào)用不同簽名的函數(shù)的實(shí)現(xiàn)
本文主要介紹了Go語(yǔ)言中動(dòng)態(tài)調(diào)用不同簽名的函數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
Golang正整數(shù)指定規(guī)則排序算法問(wèn)題分析
這篇文章主要介紹了Golang正整數(shù)指定規(guī)則排序算法問(wèn)題,結(jié)合實(shí)例形式分析了Go語(yǔ)言排序算法操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
淺析Go語(yǔ)言容器之?dāng)?shù)組和切片的使用
在?Java?的核心庫(kù)中,集合框架可謂鼎鼎大名:Array?、List、Set等等,隨便拎一個(gè)出來(lái)都值得開發(fā)者好好學(xué)習(xí)如何使用甚至是背后的設(shè)計(jì)源碼。雖然Go語(yǔ)言沒(méi)有如此豐富的容器類型,但也有一些基本的容器供開發(fā)者使用,接下來(lái)讓我們認(rèn)識(shí)一下這些容器類型吧2022-11-11
Go語(yǔ)言使用Zap輕松搞定結(jié)構(gòu)化日志
在?Go?語(yǔ)言中,有許多日志庫(kù)可供選擇,但在性能和靈活性方面,Zap?是其中的佼佼者,下面我們就來(lái)看看Go?項(xiàng)目中如何使用?Zap?進(jìn)行結(jié)構(gòu)化日志記錄吧2024-11-11
goland 設(shè)置project gopath的操作
這篇文章主要介紹了goland 設(shè)置project gopath的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
Go項(xiàng)目配置管理神器之viper的介紹與使用詳解
viper是一個(gè)完整的?Go應(yīng)用程序的配置解決方案,它被設(shè)計(jì)為在應(yīng)用程序中工作,并能處理所有類型的配置需求和格式,下面這篇文章主要給大家介紹了關(guān)于Go項(xiàng)目配置管理神器之viper的介紹與使用,需要的朋友可以參考下2023-02-02
Go語(yǔ)言結(jié)合gorm實(shí)現(xiàn)讀取PostgreSQL的json數(shù)據(jù)類型
使用gorm讀取PostgreSQL中json/jsonb類型數(shù)據(jù)是一個(gè)常見的操作,本文介紹幾種方法,適用于幾類不同的場(chǎng)景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10

