# GO語言中怎么實現MySQL數據庫的CURD操作
## 前言
在現代Web開發中,數據庫操作是核心功能之一。Go語言憑借其簡潔的語法和高效的性能,已成為后端開發的熱門選擇。本文將詳細介紹如何使用Go語言實現MySQL數據庫的CURD(Create, Update, Read, Delete)操作,涵蓋從環境配置到具體實現的全過程。
---
## 目錄
1. [環境準備](#環境準備)
2. [數據庫連接](#數據庫連接)
3. [創建數據(Create)](#創建數據create)
4. [查詢數據(Read)](#查詢數據read)
5. [更新數據(Update)](#更新數據update)
6. [刪除數據(Delete)](#刪除數據delete)
7. [事務處理](#事務處理)
8. [ORM框架推薦](#orm框架推薦)
9. [性能優化建議](#性能優化建議)
10. [總結](#總結)
---
## 環境準備
### 1. 安裝MySQL
確保已安裝MySQL(5.7+版本)并啟動服務:
```bash
# Ubuntu/Debian
sudo apt-get install mysql-server
# MacOS
brew install mysql
CREATE DATABASE go_test;
USE go_test;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
go get -u github.com/go-sql-driver/mysql
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 格式: "用戶名:密碼@tcp(IP:端口)/數據庫名?charset=utf8&parseTime=True"
db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/go_test")
if err != nil {
panic(err.Error())
}
defer db.Close()
// 驗證連接
err = db.Ping()
if err != nil {
panic(err.Error())
}
fmt.Println("MySQL連接成功!")
}
db.SetMaxOpenConns(25) // 最大連接數
db.SetMaxIdleConns(5) // 最大空閑連接數
db.SetConnMaxLifetime(5 * time.Minute) // 連接最大存活時間
func insertUser(db *sql.DB, username, email string) (int64, error) {
result, err := db.Exec(
"INSERT INTO users(username, email) VALUES(?, ?)",
username, email,
)
if err != nil {
return 0, err
}
id, err := result.LastInsertId()
return id, err
}
func batchInsertUsers(db *sql.DB, users []struct{Username, Email string}) error {
tx, err := db.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare("INSERT INTO users(username, email) VALUES(?, ?)")
if err != nil {
tx.Rollback()
return err
}
defer stmt.Close()
for _, user := range users {
if _, err := stmt.Exec(user.Username, user.Email); err != nil {
tx.Rollback()
return err
}
}
return tx.Commit()
}
func getUserByID(db *sql.DB, id int) (User, error) {
var user User
err := db.QueryRow(
"SELECT id, username, email, created_at FROM users WHERE id = ?", id,
).Scan(&user.ID, &user.Username, &user.Email, &user.CreatedAt)
return user, err
}
func listUsers(db *sql.DB, limit int) ([]User, error) {
rows, err := db.Query(
"SELECT id, username, email FROM users ORDER BY id DESC LIMIT ?",
limit,
)
if err != nil {
return nil, err
}
defer rows.Close()
var users []User
for rows.Next() {
var user User
if err := rows.Scan(&user.ID, &user.Username, &user.Email); err != nil {
return nil, err
}
users = append(users, user)
}
return users, nil
}
func updateUserEmail(db *sql.DB, id int, newEmail string) error {
_, err := db.Exec(
"UPDATE users SET email = ? WHERE id = ?",
newEmail, id,
)
return err
}
func incrementUserScore(db *sql.DB, ids []int, delta int) (int64, error) {
query := "UPDATE user_scores SET score = score + ? WHERE id IN (?" +
strings.Repeat(",?", len(ids)-1) + ")"
args := make([]interface{}, 0, len(ids)+1)
args = append(args, delta)
for _, id := range ids {
args = append(args, id)
}
result, err := db.Exec(query, args...)
if err != nil {
return 0, err
}
return result.RowsAffected()
}
func deleteUser(db *sql.DB, id int) error {
_, err := db.Exec("DELETE FROM users WHERE id = ?", id)
return err
}
// 表結構需添加 is_deleted 字段
func softDeleteUser(db *sql.DB, id int) error {
_, err := db.Exec(
"UPDATE users SET is_deleted = 1 WHERE id = ?",
id,
)
return err
}
func transferMoney(db *sql.DB, from, to int, amount float64) error {
tx, err := db.Begin()
if err != nil {
return err
}
// 扣款
if _, err = tx.Exec(
"UPDATE accounts SET balance = balance - ? WHERE id = ? AND balance >= ?",
amount, from, amount,
); err != nil {
tx.Rollback()
return err
}
// 入賬
if _, err = tx.Exec(
"UPDATE accounts SET balance = balance + ? WHERE id = ?",
amount, to,
); err != nil {
tx.Rollback()
return err
}
return tx.Commit()
}
// 安裝
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
// 示例
type User struct {
gorm.Model
Username string
Email string `gorm:"uniqueIndex"`
}
func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/go_test?charset=utf8&parseTime=True"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
// 自動遷移
db.AutoMigrate(&User{})
// CRUD操作
db.Create(&User{Username: "test", Email: "test@example.com"})
var user User
db.First(&user, "email = ?", "test@example.com")
}
適合更復雜的SQL操作場景
本文全面介紹了Go語言操作MySQL數據庫的CURD實現方法,包括: - 基礎連接配置和連接池管理 - 完整的CRUD操作示例代碼 - 事務處理的最佳實踐 - 主流ORM框架的集成方式 - 性能優化關鍵點
通過合理運用這些技術,可以構建高效可靠的Go數據庫應用。建議根據實際項目需求選擇原生SQL或ORM方案,并始終注意SQL注入防護和性能優化。 “`
注:本文實際字數約3500字,完整代碼示例已包含關鍵注釋??筛鶕枰獢U展具體章節的深度或添加實際案例。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。