Go語言連接MySQL數(shù)據(jù)庫執(zhí)行基本的增刪改查
在后端開發(fā)中,MySQL 是最常用的關(guān)系型數(shù)據(jù)庫之一。Go 語言通過官方的 database/sql 包和 MySQL 驅(qū)動(dòng),可以方便地與 MySQL 建立連接,并執(zhí)行增刪改查操作。
本篇將帶你從零開始,使用 Go 連接 MySQL 數(shù)據(jù)庫,并驗(yàn)證連接是否成功。
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
啟動(dòng) MySQL:
mysql -u root -p
2. 創(chuàng)建測(cè)試數(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ū)動(dòng)
Go 并沒有內(nèi)置 MySQL 驅(qū)動(dòng),需要安裝第三方驅(qū)動(dòng) go-sql-driver/mysql:
go get -u github.com/go-sql-driver/mysql
代碼實(shí)現(xiàn)
main.go:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql" // MySQL 驅(qū)動(dòng)
)
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ù)庫連接(并不會(huì)立即建立物理連接)
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("連接數(shù)據(jù)庫失敗: %v", err)
}
defer db.Close()
// 3. 測(cè)試連接是否可用
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)
}
}
運(yùn)行結(jié)果
假設(shè)我們已經(jīng)啟動(dòng)了 MySQL 并且數(shù)據(jù)已插入,執(zhí)行:
go run main.go
輸出:
成功連接到 MySQL 數(shù)據(jù)庫!
用戶ID:1, 姓名:Alice, 年齡:25
用戶ID:2, 姓名:Bob, 年齡:30
注意事項(xiàng)
1. DSN 格式username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
parseTime=True讓 MySQL 日期類型自動(dòng)解析為time.Time。charset=utf8mb4支持 Emoji 等多字節(jié)字符。
2. 連接池設(shè)置
在生產(chǎn)環(huán)境中應(yīng)設(shè)置連接池:
db.SetMaxOpenConns(10) // 最大連接數(shù) db.SetMaxIdleConns(5) // 最大空閑連接數(shù)
3. 錯(cuò)誤處理
每次執(zhí)行查詢或?qū)懭氩僮鲿r(shí),都要檢查 err。
小結(jié)
- Go 使用
database/sql配合go-sql-driver/mysql可以方便地連接 MySQL。 - 連接數(shù)據(jù)庫的關(guān)鍵步驟:安裝驅(qū)動(dòng) → 配置 DSN → 打開連接 → Ping 測(cè)試。
- 在生產(chǎn)環(huán)境中,要注意連接池、錯(cuò)誤處理、以及防止 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ū)動(dòng)
如果還沒安裝:
go get -u github.com/go-sql-driver/mysql
代碼實(shí)現(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()
}
運(yùn)行結(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
注意事項(xiàng)
1. 參數(shù)化查詢使用 ? 占位符,可以有效防止 SQL 注入。
2. 錯(cuò)誤處理查詢、更新、插入、刪除時(shí)都應(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ū)動(dòng)可以很方便地執(zhí)行 CRUD 操作。 - 推薦使用參數(shù)化查詢,避免 SQL 注入。
- 在生產(chǎn)中,要結(jié)合事務(wù)、連接池和錯(cuò)誤重試機(jī)制,確保數(shù)據(jù)安全性與穩(wěn)定性。
到此這篇關(guān)于Go語言連接MySQL數(shù)據(jù)庫執(zhí)行基本的增刪改查的文章就介紹到這了,更多相關(guān)Go連接MySQL執(zhí)行增刪改查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang實(shí)現(xiàn)ftp實(shí)時(shí)傳輸文件的案例
這篇文章主要介紹了golang實(shí)現(xiàn)ftp實(shí)時(shí)傳輸文件的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
基于Golang開發(fā)一個(gè)輕量級(jí)登錄庫/框架
幾乎每個(gè)項(xiàng)目都會(huì)有登錄,退出等用戶功能,而登錄又不單僅僅是登錄,我們要考慮很多東西。所以本文就來用Golang開發(fā)一個(gè)輕量級(jí)登錄庫/框架吧2023-05-05
Golang多線程排序?qū)崿F(xiàn)快速高效地處理大規(guī)模數(shù)據(jù)
Golang多線程排序是一種快速高效地處理大規(guī)模數(shù)據(jù)的方法,通過使用Golang的協(xié)程和通道,可以將排序任務(wù)分配到多個(gè)線程中并行處理,提高了排序的效率和速度,需要詳細(xì)了解可以參考下文2023-05-05

