Go语言实战案例:连接MySQL数据库

在后端开发中,MySQL 是最常用的关系型数据库之一。Go 语言通过官方的 database/sql 包和 MySQL 驱动,可以方便地与 MySQL 建立连接,并执行增删改查操作。

本篇将带你从零开始,使用 Go 连接 MySQL 数据库,并验证连接是否成功。


一、准备工作

1. 安装 MySQL

如果你本地还没有 MySQL,可以通过以下方式安装:

  • • Windows/Mac 用户:从 MySQL 官方网站 下载并安装。
  • • Linux 用户:
bash 复制代码
sudo apt install mysql-server     # Debian/Ubuntu
sudo yum install mysql-server     # CentOS

启动 MySQL:

css 复制代码
mysql -u root -p

2. 创建测试数据库与表

登录 MySQL 后执行:

sql 复制代码
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 驱动

Go 并没有内置 MySQL 驱动,需要安装第三方驱动 go-sql-driver/mysql

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

三、代码实现

main.go

go 复制代码
package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql" // MySQL 驱动
)

func main() {
    // 1. 定义 MySQL DSN(数据源名称)
    dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"

    // 2. 打开数据库连接(并不会立即建立物理连接)
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatalf("连接数据库失败: %v", err)
    }
    defer db.Close()

    // 3. 测试连接是否可用
    if err := db.Ping(); err != nil {
        log.Fatalf("无法连接到数据库: %v", err)
    }
    fmt.Println("成功连接到 MySQL 数据库!")

    // 4. 查询数据
    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("读取数据失败: %v", err)
        }
        fmt.Printf("用户ID:%d, 姓名:%s, 年龄:%d\n", id, name, age)
    }
}

四、运行结果

假设我们已经启动了 MySQL 并且数据已插入,执行:

go 复制代码
go run main.go

输出:

makefile 复制代码
成功连接到 MySQL 数据库!
用户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 等多字节字符。
    1. 连接池设置

    在生产环境中应设置连接池:

    scss 复制代码
    db.SetMaxOpenConns(10) // 最大连接数
    db.SetMaxIdleConns(5)  // 最大空闲连接数
    1. 错误处理

    每次执行查询或写入操作时,都要检查 err


六、总结

  • • Go 使用 database/sql 配合 go-sql-driver/mysql 可以方便地连接 MySQL。
  • • 连接数据库的关键步骤:安装驱动 → 配置 DSN → 打开连接 → Ping 测试。
  • • 在生产环境中,要注意连接池、错误处理、以及防止 SQL 注入(使用 Prepare 或参数化查询)。

相关推荐
派大鑫wink3 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼3 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII3 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home3 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
zfj3213 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446233 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
JIngJaneIL4 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小信啊啊4 小时前
Go语言切片slice
开发语言·后端·golang
Victor3566 小时前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端
缘不易6 小时前
Springboot 整合JustAuth实现gitee授权登录
spring boot·后端·gitee