Go語言連接MySQL數(shù)據(jù)庫執(zhí)行基本的增刪改查
在后端開發(fā)中,MySQL 是最常用的關(guān)系型數(shù)據(jù)庫之一。Go 語言通過官方的 database/sql 包和 MySQL 驅(qū)動,可以方便地與 MySQL 建立連接,并執(zhí)行增刪改查操作。
本篇將帶你從零開始,使用 Go 連接 MySQL 數(shù)據(jù)庫,并驗證連接是否成功。
Go語言連接MySQL數(shù)據(jù)庫
準(zhǔn)備工作
1. 安裝 MySQL
如果你本地還沒有 MySQL,可以通過以下方式安裝:
- Windows/Mac 用戶:從 MySQL 官方網(wǎng)站 下載并安裝。
- Linux 用戶:
sudo apt install mysql-server # Debian/Ubuntu sudo yum install mysql-server # CentOS
啟動 MySQL:
mysql -u root -p
2. 創(chuàng)建測試數(shù)據(jù)庫與表
登錄 MySQL 后執(zhí)行:
CREATE DATABASE go_demo;
USE go_demo;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
INSERT INTO users (name, age) VALUES
('Alice', 25),
('Bob', 30);
安裝 MySQL 驅(qū)動
Go 并沒有內(nèi)置 MySQL 驅(qū)動,需要安裝第三方驅(qū)動 go-sql-driver/mysql:
go get -u github.com/go-sql-driver/mysql
代碼實現(xiàn)
main.go:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql" // MySQL 驅(qū)動
)
func main() {
// 1. 定義 MySQL DSN(數(shù)據(jù)源名稱)
dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"
// 2. 打開數(shù)據(jù)庫連接(并不會立即建立物理連接)
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("連接數(shù)據(jù)庫失敗: %v", err)
}
defer db.Close()
// 3. 測試連接是否可用
if err := db.Ping(); err != nil {
log.Fatalf("無法連接到數(shù)據(jù)庫: %v", err)
}
fmt.Println("成功連接到 MySQL 數(shù)據(jù)庫!")
// 4. 查詢數(shù)據(jù)
rows, err := db.Query("SELECT id, name, age FROM users")
if err != nil {
log.Fatalf("查詢失敗: %v", err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
var age int
if err := rows.Scan(&id, &name, &age); err != nil {
log.Fatalf("讀取數(shù)據(jù)失敗: %v", err)
}
fmt.Printf("用戶ID:%d, 姓名:%s, 年齡:%d\n", id, name, age)
}
}
運行結(jié)果
假設(shè)我們已經(jīng)啟動了 MySQL 并且數(shù)據(jù)已插入,執(zhí)行:
go run main.go
輸出:
成功連接到 MySQL 數(shù)據(jù)庫!
用戶ID:1, 姓名:Alice, 年齡:25
用戶ID:2, 姓名:Bob, 年齡:30
注意事項
1. DSN 格式username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
parseTime=True讓 MySQL 日期類型自動解析為time.Time。charset=utf8mb4支持 Emoji 等多字節(jié)字符。
2. 連接池設(shè)置
在生產(chǎn)環(huán)境中應(yīng)設(shè)置連接池:
db.SetMaxOpenConns(10) // 最大連接數(shù) db.SetMaxIdleConns(5) // 最大空閑連接數(shù)
3. 錯誤處理
每次執(zhí)行查詢或?qū)懭氩僮鲿r,都要檢查 err。
小結(jié)
- Go 使用
database/sql配合go-sql-driver/mysql可以方便地連接 MySQL。 - 連接數(shù)據(jù)庫的關(guān)鍵步驟:安裝驅(qū)動 → 配置 DSN → 打開連接 → Ping 測試。
- 在生產(chǎn)環(huán)境中,要注意連接池、錯誤處理、以及防止 SQL 注入(使用
Prepare或參數(shù)化查詢)。
Go語言執(zhí)行基本的增刪改查
準(zhǔn)備工作
數(shù)據(jù)庫與表
假設(shè)我們已經(jīng)創(chuàng)建好數(shù)據(jù)庫和表(go_demo 數(shù)據(jù)庫中的 users 表):
CREATE DATABASE go_demo;
USE go_demo;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
安裝 MySQL 驅(qū)動
如果還沒安裝:
go get -u github.com/go-sql-driver/mysql
代碼實現(xiàn)
main.go:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
func initDB() {
var err error
dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err = sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("連接數(shù)據(jù)庫失敗: %v", err)
}
if err := db.Ping(); err != nil {
log.Fatalf("無法連接到數(shù)據(jù)庫: %v", err)
}
fmt.Println("數(shù)據(jù)庫連接成功!")
}
// Create - 插入數(shù)據(jù)
func createUser(name string, age int) {
result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", name, age)
if err != nil {
log.Fatalf("插入數(shù)據(jù)失敗: %v", err)
}
id, _ := result.LastInsertId()
fmt.Printf("新增用戶成功,ID = %d\n", id)
}
// Read - 查詢數(shù)據(jù)
func getUsers() {
rows, err := db.Query("SELECT id, name, age FROM users")
if err != nil {
log.Fatalf("查詢失敗: %v", err)
}
defer rows.Close()
fmt.Println("用戶列表:")
for rows.Next() {
var id, age int
var name string
if err := rows.Scan(&id, &name, &age); err != nil {
log.Fatalf("讀取數(shù)據(jù)失敗: %v", err)
}
fmt.Printf("ID: %d, 姓名: %s, 年齡: %d\n", id, name, age)
}
}
// Update - 更新數(shù)據(jù)
func updateUser(id int, newAge int) {
result, err := db.Exec("UPDATE users SET age = ? WHERE id = ?", newAge, id)
if err != nil {
log.Fatalf("更新數(shù)據(jù)失敗: %v", err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Printf("更新完成,影響行數(shù): %d\n", rowsAffected)
}
// Delete - 刪除數(shù)據(jù)
func deleteUser(id int) {
result, err := db.Exec("DELETE FROM users WHERE id = ?", id)
if err != nil {
log.Fatalf("刪除數(shù)據(jù)失敗: %v", err)
}
rowsAffected, _ := result.RowsAffected()
fmt.Printf("刪除完成,影響行數(shù): %d\n", rowsAffected)
}
func main() {
initDB()
// 增
createUser("Alice", 25)
createUser("Bob", 30)
// 查
getUsers()
// 改
updateUser(1, 26)
// 查
getUsers()
// 刪
deleteUser(2)
// 查
getUsers()
}
運行結(jié)果
假設(shè)我們執(zhí)行:
go run main.go
輸出可能是:
數(shù)據(jù)庫連接成功!
新增用戶成功,ID = 1
新增用戶成功,ID = 2
用戶列表:
ID: 1, 姓名: Alice, 年齡: 25
ID: 2, 姓名: Bob, 年齡: 30
更新完成,影響行數(shù): 1
用戶列表:
ID: 1, 姓名: Alice, 年齡: 26
ID: 2, 姓名: Bob, 年齡: 30
刪除完成,影響行數(shù): 1
用戶列表:
ID: 1, 姓名: Alice, 年齡: 26
注意事項
1. 參數(shù)化查詢使用 ? 占位符,可以有效防止 SQL 注入。
2. 錯誤處理查詢、更新、插入、刪除時都應(yīng)檢查 err。
3. 連接池在生產(chǎn)環(huán)境中,建議配置連接池:
db.SetMaxOpenConns(10) db.SetMaxIdleConns(5)
4. 事務(wù)支持如果多條 SQL 需要保證原子性,應(yīng)使用 db.Begin() 開啟事務(wù)。
小結(jié)
- Go 使用
database/sql+ MySQL 驅(qū)動可以很方便地執(zhí)行 CRUD 操作。 - 推薦使用參數(shù)化查詢,避免 SQL 注入。
- 在生產(chǎn)中,要結(jié)合事務(wù)、連接池和錯誤重試機制,確保數(shù)據(jù)安全性與穩(wěn)定性。
到此這篇關(guān)于Go語言連接MySQL數(shù)據(jù)庫執(zhí)行基本的增刪改查的文章就介紹到這了,更多相關(guān)Go連接MySQL執(zhí)行增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go基于GORM 獲取當(dāng)前請求所執(zhí)行的 SQL 信息(思路詳解)
這篇文章主要介紹了Go基于GORM 獲取當(dāng)前請求所執(zhí)行的 SQL 信息(思路詳解),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
在Go中動態(tài)替換SQL查詢中的日期參數(shù)的完整步驟
在處理數(shù)據(jù)庫查詢時,經(jīng)常需要根據(jù)不同的輸入條件動態(tài)地構(gòu)造SQL語句,尤其是在涉及日期范圍的查詢中,能夠根據(jù)實際需求調(diào)整查詢的起始和結(jié)束日期顯得尤為重要,在本文中,我將介紹如何在Go語言中實現(xiàn)動態(tài)替換SQL查詢中的日期參數(shù),需要的朋友可以參考下2024-11-11
適合PHP同學(xué)的GoFrame框架使用體驗及學(xué)習(xí)建議
這篇文章主要為大家介紹了非常適合PHP同學(xué)使用的GoFrame框架設(shè)計思想使用體驗及學(xué)習(xí)建議介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
Mac上Go環(huán)境和VS Code的正確安裝與配置方法
Go語言是一個新興的語言。下面介紹一下如何在Mac系統(tǒng)下安裝和使用這個語言,Go語言提供了mac下安裝包,可直接下載安裝包點擊安裝2018-03-03
Go項目與Docker結(jié)合實現(xiàn)高效部署深入探究
在現(xiàn)代軟件開發(fā)中,使用Docker部署應(yīng)用程序已經(jīng)成為一種標(biāo)準(zhǔn)實踐,本文將深入探討如何將Go項目與Docker結(jié)合,實現(xiàn)高效、可靠的部署過程,通過詳細的步驟和豐富的示例,你將能夠迅速掌握這一流程2023-12-12
go語言使用Casbin實現(xiàn)角色的權(quán)限控制
Casbin是用于Golang項目的功能強大且高效的開源訪問控制庫。本文主要介紹了go語言使用Casbin實現(xiàn)角色的權(quán)限控制,感興趣的可以了解下2021-06-06

