Go 语言高效连接 MySQL 数据库:从入门到实战

在 Go 语言的开发过程中,与 MySQL 数据库的交互是常见需求之一。本文将深入讲解如何使用 Go 语言高效、安全地连接 MySQL 数据库,并进行数据操作。

1. 安装 MySQL 驱动

Go 语言通常使用 github.com/go-sql-driver/mysql 作为 MySQL 驱动,首先需要安装它:

go 复制代码
go get -u github.com/go-sql-driver/mysql

2. 连接 MySQL 数据库

在 Go 代码中,使用 database/sql 包结合 go-sql-driver/mysql 进行数据库连接。

go 复制代码
package main

import (
    "database/sql"
    "fmt"
    "log"
    "time"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // 配置 MySQL 连接信息
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 设置连接池参数
    db.SetMaxOpenConns(100) // 最大打开连接数
    db.SetMaxIdleConns(10)  // 最大空闲连接数
    db.SetConnMaxLifetime(60 * time.Second) // 连接最大存活时间

    // 测试连接是否成功
    if err := db.Ping(); err != nil {
        log.Fatal(err)
    }
    fmt.Println("成功连接到 MySQL 数据库!")

    // 插入数据
    insertQuery := "INSERT INTO users(name, age) VALUES(?, ?)"
    result, err := db.Exec(insertQuery, "张三", 28)
    if err != nil {
        log.Fatal(err)
    }
    lastInsertID, _ := result.LastInsertId()
    fmt.Println("插入成功,ID:", lastInsertID)

    // 查询数据
    selectQuery := "SELECT id, name, age FROM users WHERE age > ?"
    rows, err := db.Query(selectQuery, 20)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name string
        var age int
        err := rows.Scan(&id, &name, &age)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age)
    }

    // 事务处理
    tx, err := db.Begin()
    if err != nil {
        log.Fatal(err)
    }

    _, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", 100, 1)
    if err != nil {
        tx.Rollback()
        log.Fatal(err)
    }

    _, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", 100, 2)
    if err != nil {
        tx.Rollback()
        log.Fatal(err)
    }

    err = tx.Commit()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("事务提交成功!")
}

3. 结论

本文介绍了 Go 语言连接 MySQL 数据库的完整流程,包括驱动安装、基本 CRUD 操作、连接池优化和事务处理等。希望能帮助你更高效地使用 Go 进行数据库开发!

相关推荐
码事漫谈1 小时前
C++模板元编程从入门到精通
后端
_風箏1 小时前
Java【代码 14】一个用于判断磁盘空间和分区表是否需要清理的工具类
后端
_風箏1 小时前
Java【代码 13】前端动态添加一条记后端使用JDK1.8实现map对象根据key的部分值进行分组(将map对象封装成指定entity对象)
后端
_風箏1 小时前
Java【代码 12】判断一个集合是否包含另一个集合中的一个或多个元素 retainAll() 及其他方法
后端
Java中文社群2 小时前
Coze开源版?别吹了!
人工智能·后端·开源
懂得节能嘛.2 小时前
【SpringAI实战】ChatPDF实现RAG知识库
java·后端·spring
fengye2071612 小时前
板凳-------Mysql cookbook学习 (十二--------6)
学习·mysql·adb
站大爷IP2 小时前
Python爬虫库性能与选型实战指南:从需求到落地的全链路解析
后端
小杰来搬砖2 小时前
在 Java 的 MyBatis 框架中,# 和 $ 的区别
后端
wenb1n2 小时前
【安全漏洞】隐藏在HTTP请求中的“隐形杀手”:Host头攻击漏洞深度剖析
java·后端