Go基础:用Go语言操作MySQL详解

文章目录

    • 一、MySQL数据库连接
      • [1.1 下载依赖](#1.1 下载依赖)
      • [1.2 初始化连接](#1.2 初始化连接)
      • [1.3 连接池配置](#1.3 连接池配置)
    • 二、MySQL的CRUD操作
      • [2.1 建库建表](#2.1 建库建表)
      • [2.2 插入数据](#2.2 插入数据)
      • [2.3 查询数据](#2.3 查询数据)
      • [2.4 更新数据](#2.4 更新数据)
      • [2.5 删除数据](#2.5 删除数据)
    • 三、完整代码案例

一、MySQL数据库连接

Go语言操作MySQL是开发中常见的任务,通过Go语言的标准库database/sql和第三方MySQL驱动(如go-sql-driver/mysql),可以方便地实现数据库的连接、查询、插入、更新和删除等操作。

1.1 下载依赖

在Go语言中操作MySQL,首先需要安装MySQL驱动。常用的驱动是go-sql-driver/mysql,可以通过以下命令安装:

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

1.2 初始化连接

使用database/sql包和MySQL驱动初始化数据库连接。以下是一个简单的连接示例:

go 复制代码
package main
import (
	"database/sql"
	"fmt"
	"log"
	_ "github.com/go-sql-driver/mysql"
)
func main() {
	// 数据库连接字符串
	dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		log.Fatal("Failed to open database:", err)
	}
	defer db.Close()
	// 测试连接是否成功
	err = db.Ping()
	if err != nil {
		log.Fatal("Failed to connect to database:", err)
	}
	fmt.Println("Successfully connected to MySQL database!")
}

1.3 连接池配置

为了提高性能,可以配置数据库连接池:

go 复制代码
db.SetMaxOpenConns(10) // 设置最大打开的连接数
db.SetMaxIdleConns(5)  // 设置最大空闲连接数

二、MySQL的CRUD操作

2.1 建库建表

在操作数据之前,首先需要创建数据库和表。以下是建表SQL语句示例:

sql 复制代码
CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;
CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2.2 插入数据

使用Exec方法插入数据:

go 复制代码
func insertUser(db *sql.DB, name string, age int) error {
	query := "INSERT INTO users (name, age) VALUES (?, ?)"
	_, err := db.Exec(query, name, age)
	if err != nil {
		return err
	}
	fmt.Println("User inserted successfully!")
	return nil
}

调用示例:

go 复制代码
err := insertUser(db, "Alice", 25)
if err != nil {
	log.Fatal("Failed to insert user:", err)
}

2.3 查询数据

使用Query方法查询数据:

go 复制代码
func queryUsers(db *sql.DB) error {
	query := "SELECT id, name, age FROM users"
	rows, err := db.Query(query)
	if err != nil {
		return err
	}
	defer rows.Close()
	fmt.Println("Users:")
	for rows.Next() {
		var id int
		var name string
		var age int
		if err := rows.Scan(&id, &name, &age); err != nil {
			return err
		}
		fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age)
	}
	return nil
}

调用示例:

go 复制代码
err := queryUsers(db)
if err != nil {
	log.Fatal("Failed to query users:", err)
}

2.4 更新数据

使用Exec方法更新数据:

go 复制代码
func updateUser(db *sql.DB, id int, newName string, newAge int) error {
	query := "UPDATE users SET name = ?, age = ? WHERE id = ?"
	_, err := db.Exec(query, newName, newAge, id)
	if err != nil {
		return err
	}
	fmt.Println("User updated successfully!")
	return nil
}

调用示例:

go 复制代码
err := updateUser(db, 1, "Bob", 30)
if err != nil {
	log.Fatal("Failed to update user:", err)
}

2.5 删除数据

使用Exec方法删除数据:

go 复制代码
func deleteUser(db *sql.DB, id int) error {
	query := "DELETE FROM users WHERE id = ?"
	_, err := db.Exec(query, id)
	if err != nil {
		return err
	}
	fmt.Println("User deleted successfully!")
	return nil
}

调用示例:

go 复制代码
err := deleteUser(db, 1)
if err != nil {
	log.Fatal("Failed to delete user:", err)
}

三、完整代码案例

以下是一个完整的Go语言操作MySQL的示例代码,包含连接、插入、查询、更新和删除操作:

go 复制代码
package main
import (
	"database/sql"
	"fmt"
	"log"
	_ "github.com/go-sql-driver/mysql"
)
func main() {
	dsn := "username:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		log.Fatal("Failed to open database:", err)
	}
	defer db.Close()
	err = db.Ping()
	if err != nil {
		log.Fatal("Failed to connect to database:", err)
	}
	fmt.Println("Successfully connected to MySQL database!")
	// 插入数据
	err = insertUser(db, "Alice", 25)
	if err != nil {
		log.Fatal("Failed to insert user:", err)
	}
	// 查询数据
	err = queryUsers(db)
	if err != nil {
		log.Fatal("Failed to query users:", err)
	}
	// 更新数据
	err = updateUser(db, 1, "Bob", 30)
	if err != nil {
		log.Fatal("Failed to update user:", err)
	}
	// 查询更新后的数据
	err = queryUsers(db)
	if err != nil {
		log.Fatal("Failed to query users:", err)
	}
	// 删除数据
	err = deleteUser(db, 1)
	if err != nil {
		log.Fatal("Failed to delete user:", err)
	}
	// 查询删除后的数据
	err = queryUsers(db)
	if err != nil {
		log.Fatal("Failed to query users:", err)
	}
}
func insertUser(db *sql.DB, name string, age int) error {
	query := "INSERT INTO users (name, age) VALUES (?, ?)"
	_, err := db.Exec(query, name, age)
	if err != nil {
		return err
	}
	fmt.Println("User inserted successfully!")
	return nil
}
func queryUsers(db *sql.DB) error {
	query := "SELECT id, name, age FROM users"
	rows, err := db.Query(query)
	if err != nil {
		return err
	}
	defer rows.Close()
	fmt.Println("Users:")
	for rows.Next() {
		var id int
		var name string
		var age int
		if err := rows.Scan(&id, &name, &age); err != nil {
			return err
		}
		fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age)
	}
	return nil
}
func updateUser(db *sql.DB, id int, newName string, newAge int) error {
	query := "UPDATE users SET name = ?, age = ? WHERE id = ?"
	_, err := db.Exec(query, newName, newAge, id)
	if err != nil {
		return err
	}
	fmt.Println("User updated successfully!")
	return nil
}
func deleteUser(db *sql.DB, id int) error {
	query := "DELETE FROM users WHERE id = ?"
	_, err := db.Exec(query, id)
	if err != nil {
		return err
	}
	fmt.Println("User deleted successfully!")
	return nil
}

总结 :Go语言通过database/sql包和MySQL驱动,提供了强大的数据库操作能力。本文详细介绍了MySQL的连接、插入、查询、更新和删除操作,并提供了完整的代码示例。

相关推荐
酒尘&19 分钟前
JS数组不止Array!索引集合类全面解析
开发语言·前端·javascript·学习·js
无限大622 分钟前
计算机十万个为什么--数据库索引
后端
tzhou6445229 分钟前
MySQL备份与恢复
数据库·mysql·adb
冬夜戏雪30 分钟前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
xwill*35 分钟前
分词器(Tokenizer)-sentencepiece(把训练语料中的字符自动组合成一个最优的子词(subword)集合。)
开发语言·pytorch·python
一过菜只因40 分钟前
MySql Jdbc
android·数据库·mysql
学历真的很重要44 分钟前
VsCode+Roo Code+Gemini 2.5 Pro+Gemini Balance AI辅助编程环境搭建(理论上通过多个Api Key负载均衡达到无限免费Gemini 2.5 Pro)
前端·人工智能·vscode·后端·语言模型·负载均衡·ai编程
福大大架构师每日一题1 小时前
go-zero v1.9.3 版本更新:一致性哈希负载均衡、gRPC优化、链路追踪修复、ORM完善等重要提升
golang·负载均衡·哈希算法
咖啡の猫1 小时前
Python列表的查询操作
开发语言·python
思成不止于此1 小时前
MySQL 查询实战(三):排序与综合练习
数据库·笔记·学习·mysql