《Go 语言数据库操作总结:快速实现数据交互》

Go 语言数据库操作总结:快速实现数据交互

引言

Go 语言凭借高并发特性和简洁语法,成为数据库交互的理想选择。其标准库 database/sql 提供统一接口,配合轻量级 ORM 工具(如 GORM),可快速实现数据操作。以下通过代码示例逐步解析关键操作。


一、准备工作
  1. 安装驱动
    以 MySQL 为例:

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

  2. 建立连接池

    import (
        "database/sql"
        _ "github.com/go-sql-driver/mysql"
    )
    
    func main() {
        // 连接配置
        db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
        if err != nil {
            panic(err)
        }
        defer db.Close()
        
        // 设置连接池参数
        db.SetMaxOpenConns(10)  // 最大连接数
        db.SetMaxIdleConns(5)   // 最大空闲连接
    }
    


二、基本 CRUD 操作
  1. 插入数据

    result, err := db.Exec(
        "INSERT INTO users (name, age) VALUES (?, ?)", 
        "Alice", 30,
    )
    if err != nil {
        log.Fatal(err)
    }
    id, _ := result.LastInsertId() // 获取自增ID
    

  2. 查询数据

    rows, err := db.Query("SELECT id, name FROM users WHERE age > ?", 25)
    defer rows.Close()
    
    for rows.Next() {
        var id int
        var name string
        rows.Scan(&id, &name)
        fmt.Printf("ID: %d, Name: %s\n", id, name)
    }
    

  3. 更新与删除

    // 更新
    db.Exec("UPDATE users SET age = ? WHERE id = ?", 31, 1)
    
    // 删除
    db.Exec("DELETE FROM users WHERE id = ?", 2)
    


三、进阶操作
  1. 事务处理

    tx, _ := db.Begin()
    _, err1 := tx.Exec("UPDATE account SET balance = balance - ? WHERE id = ?", 100, 1)
    _, err2 := tx.Exec("UPDATE account SET balance = balance + ? WHERE id = ?", 100, 2)
    
    if err1 != nil || err2 != nil {
        tx.Rollback() // 回滚
    } else {
        tx.Commit()   // 提交
    }
    

  2. 预编译语句

    stmt, _ := db.Prepare("SELECT name FROM users WHERE id = ?")
    defer stmt.Close()
    
    row := stmt.QueryRow(3)
    var name string
    row.Scan(&name) // 高效复用查询
    


四、性能优化
  1. 连接池监控

    fmt.Println("当前连接数:", db.Stats().OpenConnections)
    

  2. 批处理插入

    tx, _ := db.Begin()
    stmt, _ := tx.Prepare("INSERT INTO logs (content) VALUES (?)")
    for _, log := range logs {
        stmt.Exec(log.Content) // 减少网络往返
    }
    tx.Commit()
    


五、总结
操作类型核心方法适用场景
单次查询QueryRow()快速获取单条数据
事务操作Begin()/Commit()资金转账等原子操作
批量处理预编译语句 + 事务高频数据写入

通过标准库结合简单优化,Go 能在 20 行内完成大多数数据库交互。关键点:

  1. 始终使用 ? 占位符防 SQL 注入
  2. 通过 defer 及时释放资源
  3. 监控连接池避免泄漏

提示:复杂场景推荐使用 GORM,其链式调用支持如 db.Where("age > ?", 25).Find(&users) 的简洁操作。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值