云计算百科
云计算领域专业知识百科平台

Go语言实战案例:执行基本的增删改查

在数据库开发中,最基础的操作就是 增(Create)、查(Read)、改(Update)、删(Delete),即 CRUD。
Go 语言通过 database/sql 包和 MySQL 驱动,可以很方便地实现这些功能。

本篇我们将在 上一节“连接 MySQL” 的基础上,扩展实现 完整的 CRUD 案例。


一、准备工作

1. 数据库与表

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

CREATE DATABASE go_demo;
USE go_demo;

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


2. 安装 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: %d, 姓名: %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, err := 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, 年龄: 26


四、注意事项

  • 1. 参数化查询
    使用 ? 占位符,可以有效防止 SQL 注入。
  • 2. 错误处理
    查询、更新、插入、删除时都应检查 err。
  • 3. 连接池
    在生产环境中,建议配置连接池:

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

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

  • 五、总结

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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Go语言实战案例:执行基本的增删改查
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!