Go语言连接MySQL数据库执行基本的增删改查

2025-08-17 10:50

本文主要是介绍Go语言连接MySQL数据库执行基本的增删改查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧...

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

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

Go语言连接MySQL数据库

准备工作

1. 安装 MySQL

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

sudo apt install mysql-server     # Debian/Ubuntu
sudo yum install mysql-server     # Centos

启动 MySQL:

mysql -u root -p

2. 创建测试数据库与表

登录 MySQL 后执行:

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 get -u github.com/go-sql-driver/mysql

代码实现

main.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(&ampffBcTp;id, &name, &age); err != nil {
            log.Fatalf("读取数据失败: %v", err)
        }
        fmt.Printf("用户ID:%d, 姓名:%s, 年龄:%d\n", id, name, age)
    }
}

运行结果

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

go run main.go

输出:

成功连接到 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 等多字节字符。

2. 连接池设置

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

db.SetMaxOpenConns(10) // 最大连接数
db.SetMaxIdleConns(5)  // 最大空闲连接数

3. 错误处理

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

小结

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

Go语言执行基本的增删改查

准备工作

数据库与表

假设我们已经创建好数据库和表(go_demo 数据库中的 users 表):

CREATE DATABASE go_demo;
USE go_demo;

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT
);

安装 MySQL 驱动

如果还没安装:

go get -u github.com/go-sql-driver/mysql

代码实现

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("连接数据库失败: %v", err)
    }

    if err := db.Ping(); err != nil {
        log.Fatalf("无法连接到数据库: %v", err)
    }
    fmt.Println("数据库连接成功!")
}

// Create - 插入数据
func createUser(name string, age int) {
    result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", name, age)
    if err != nil {
        log.Fatalf(编程"插入数据失败: %v", err)
    }
    id, _ := result.LastInsertId()
    fmt.Printf("新增用户成功,ID = %d\n", id)
}

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

// Update - 更新数据
func updateUser(id int, newAge int) {
    result, err := db.Exec("UPDATE users SET age = ? WHERE id = ?", newAge, id)
    if err != nil {
        log.Fatalf("更新数据失败: %v", err)
    }
    rowsAffected, _ := result.RowsAffected()
    fmt.Printf("更新完成,影响行数: %d\n", rowsAffected)
}

// Delete - 删除数据
func deleteUser(id int) {
    result, errjs := db.Exec("DELETE FROM users WHERE id = ?", id)
    if err != nil {
        log.Fatalf("删除数据失败: %v", err)
    }
    rowsAffected, _ := result.RowsAffected()
    fmt.Printf("删除完成,影响行数: %d\n", rowsAffected)
}

func main() {
    initDB()

    // 增
    createUser("Alice", 25)
    createUser("Bob", 30)

    // 查
    getUsers()

    // 改
    updateUser(1, 26)

    // 查
    getUsers()

    // 删
    deleteUser(2)

    // 查
    getUsers()
}

运行结果

假设我们执行:

go run main.go

输出可能是:

数据库连接成功!
新增用户成功,ID = 1
新增用户成功,ID = 2
用户列表:
ID: 1, 姓名: Alice, 年龄: 25
ID: 2, 姓名: Bob, 年龄: 30
更新完成,影响行数: 1
用户列表:
ID: 1, 姓名: Alice, 年龄: 26
ID: 2, 姓名: Bob, 年龄: 30
删除完成,影响行数: 1
用户列表:
ID: 1, 姓名: Alice,&pffBcTnbsp;年龄: 26

注意事项

1. 参数化查询使用 ? 占位符,可以有效防止 SQL 注入。

2. 错误处理查询、更新、插入、删除时都应检查 err

3. 连接池在生产环境中,建议配置连接池:

db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)

4. 事务支持如果多条 SQL 需要保证原子性,应使用 db.Begin() 开启事务。

小结

  • Go 使用 database/sql + MySQL 驱动可以很方便地执行 CRUD 操作。
  • 推荐使用参数化查询,避免 SQL 注入。
  • 在生产中,要结合事务、连接池和错误重试机制,确保数据安全性与稳定性。

到此这篇关于Go语言连接MySQL数据库执行基本的增删改查的文章就介绍到这了,更多相关Go连接MySQL执行增删改查内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Go语言连接MySQL数据库执行基本的增删改查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155765

相关文章

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

SQL Server 查询数据库及数据文件大小的方法

《SQLServer查询数据库及数据文件大小的方法》文章介绍了查询数据库大小的SQL方法及存储过程实现,涵盖当前数据库、所有数据库的总大小及文件明细,本文结合实例代码给大家介绍的非常详细,感兴趣的... 目录1. 直接使用SQL1.1 查询当前数据库大小1.2 查询所有数据库的大小1.3 查询每个数据库的详

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

Go中select多路复用的实现示例

《Go中select多路复用的实现示例》Go的select用于多通道通信,实现多路复用,支持随机选择、超时控制及非阻塞操作,建议合理使用以避免协程泄漏和死循环,感兴趣的可以了解一下... 目录一、什么是select基本语法:二、select 使用示例示例1:监听多个通道输入三、select的特性四、使用se

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员