写点什么

Go 语言中如何连接 MySQL,基础必备!

作者:左诗右码
  • 2024-08-08
    上海
  • 本文字数:2401 字

    阅读完需:约 8 分钟

Go语言中如何连接 MySQL,基础必备!

在现代应用中,数据库操作是必不可少的一部分,而 Go 语言凭借其高效性和并发处理能力,成为了越来越多开发者的选择。


在本教程中,我们将学习如何使用 Go 语言与 MySQL 数据库进行基本的 CRUD(创建、读取、更新、删除)操作。我们将使用 database/sql 标准库以及 github.com/go-sql-driver/mysql 驱动来实现这些功能。

准备工作

环境要求

  • 创建一个名为 test_db 的数据库。

  • 创建一个 users 表,表结构如下:


CREATE DATABASE test_db;
USE test_db;
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, age INT NOT NULL);
复制代码

安装 MySQL 驱动

使用以下命令安装 MySQL 驱动:


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

示例代码

下面是一个完整的 Go 程序,展示如何进行基本的 CRUD 操作:


package main
import ( "database/sql" "fmt" "log"
_ "github.com/go-sql-driver/mysql")
func main() { // 数据库连接字符串 dsn := "user:password@tcp(127.0.0.1:3306)/test_db" db, err := sql.Open("mysql", dsn) if err != nil { log.Fatal(err) } // 防止 db 为 nil,因此需要先判断 err 之后才能调用 Close 方法去释放 db defer db.Close()
// 测试连接 if err := db.Ping(); err != nil { log.Fatal(err) } fmt.Println("成功连接到 MySQL 数据库!")
// 创建用户 id := createUser(db, "Alice", 25) fmt.Printf("新创建的用户 ID: %d\n", id)
// 查询所有用户 getUsers(db)
// 查询单个用户 userId := 1 getUser(db, userId)
// 更新用户 affectedRows := updateUser(db, 1, "Alice Smith", 26) fmt.Printf("受影响的行数: %d\n", affectedRows)
// 删除用户 affectedRows = deleteUser(db, 1) fmt.Printf("受影响的行数: %d\n", affectedRows)}
复制代码

创建(Insert)

// 创建用户,返回新创建用户的 IDfunc createUser(db *sql.DB, name string, age int) int {    query := "INSERT INTO users (name, age) VALUES (?, ?)"    result, err := db.Exec(query, name, age)    if err != nil {        log.Fatal(err)    }    // 获取最后插入的 ID    lastInsertId, err := result.LastInsertId()    if err != nil {        log.Fatal(err)    }    return int(lastInsertId)}
复制代码

查询(Select)

// 查询所有用户func getUsers(db *sql.DB) {    query := "SELECT id, name, age FROM users"    rows, err := db.Query(query)    if err != nil {        log.Fatal(err)    }    // 一定要记得关闭资源    defer rows.Close()
fmt.Println("所有用户:") for rows.Next() { var id int var name string var age int if err := rows.Scan(&id, &name, &age); err != nil { log.Fatal(err) } fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age) }}
// 查询单个用户func getUser(db *sql.DB, id int) { query := "SELECT id, name, age FROM users WHERE id = ?" row := db.QueryRow(query, id)
var name string var age int // 调用完了 QueryRow 方法之后,一定要记得调用 Scan 方法,否则持有的数据库连接不会被释放 if err := row.Scan(&id, &name, &age); err != nil { if err == sql.ErrNoRows { fmt.Printf("用户 ID %d 不存在\n", id) } else { log.Fatal(err) } } else { fmt.Printf("用户 ID: %d, Name: %s, Age: %d\n", id, name, age) }}
复制代码

更新(Update)

// 更新用户,返回受影响的行数func updateUser(db *sql.DB, id int, name string, age int) int {    query := "UPDATE users SET name = ?, age = ? WHERE id = ?"    result, err := db.Exec(query, name, age, id)    if err != nil {        log.Fatal(err)    }    // 获取受影响的行数    affectedRows, err := result.RowsAffected()    if err != nil {        log.Fatal(err)    }    return int(affectedRows)}
复制代码

删除(Delete)

// 删除用户,返回受影响的行数func deleteUser(db *sql.DB, id int) int {    query := "DELETE FROM users WHERE id = ?"    result, err := db.Exec(query, id)    if err != nil {        log.Fatal(err)    }    // 获取受影响的行数    affectedRows, err := result.RowsAffected()    if err != nil {        log.Fatal(err)    }    return int(affectedRows)}
复制代码

代码解析

1. 数据库连接

我们使用 sql.Open 方法连接到 MySQL 数据库,连接字符串格式为 user:password@tcp(host:port)/dbname。在连接后,我们调用 db.Ping() 测试数据库连接是否成功。

2. 创建用户

createUser 函数通过 INSERT 语句向 users 表中添加新用户,并返回新创建用户的 ID。

3. 查询用户

  • getUsers 函数查询所有用户并打印每个用户的 ID、姓名和年龄。

  • getUser 函数通过用户 ID 查询单个用户,并处理用户不存在的情况。

4. 更新用户

updateUser 函数用于更新用户信息,并返回受影响的行数,以确认操作是否成功。

5. 删除用户

deleteUser 函数用于删除指定 ID 的用户,并同样返回受影响的行数。

总结

在本文中,我们展示了如何使用 Go 语言与 MySQL 数据库进行基本的 CRUD 操作。通过本教程,您可以创建、查询、更新和删除用户数据,这为您在开发基于数据库的应用程序时打下了基础。


用这个库还是比较累赘的,代码写起来比较累,并且一般在实际应用中很少会直接拼接 sql 语句,会遇到 SQL 注入的风险,后面会介绍 sqlx 或者 gorm 的使用,这里先了解个基础知识,为后期做做准备。

发布于: 刚刚阅读数: 3
用户头像

左诗右码

关注

全网同名,欢迎关注交流。 2018-11-22 加入

三观比五官更正,思想比套路更深。常用技术栈PHP、Go、Python,享受编程,平时爱好写点文章。V公主号:「左诗右码」,欢迎关注交流。

评论

发布
暂无评论
Go语言中如何连接 MySQL,基础必备!_Go_左诗右码_InfoQ写作社区