Go 语言数据库操作总结:快速实现数据交互
引言
Go 语言凭借高并发特性和简洁语法,成为数据库交互的理想选择。其标准库 database/sql 提供统一接口,配合轻量级 ORM 工具(如 GORM),可快速实现数据操作。以下通过代码示例逐步解析关键操作。
一、准备工作
-
安装驱动
以 MySQL 为例:go get -u github.com/go-sql-driver/mysql -
建立连接池
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 操作
-
插入数据
result, err := db.Exec( "INSERT INTO users (name, age) VALUES (?, ?)", "Alice", 30, ) if err != nil { log.Fatal(err) } id, _ := result.LastInsertId() // 获取自增ID -
查询数据
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) } -
更新与删除
// 更新 db.Exec("UPDATE users SET age = ? WHERE id = ?", 31, 1) // 删除 db.Exec("DELETE FROM users WHERE id = ?", 2)
三、进阶操作
-
事务处理
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() // 提交 } -
预编译语句
stmt, _ := db.Prepare("SELECT name FROM users WHERE id = ?") defer stmt.Close() row := stmt.QueryRow(3) var name string row.Scan(&name) // 高效复用查询
四、性能优化
-
连接池监控
fmt.Println("当前连接数:", db.Stats().OpenConnections) -
批处理插入
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 行内完成大多数数据库交互。关键点:
- 始终使用
?占位符防 SQL 注入 - 通过
defer及时释放资源 - 监控连接池避免泄漏
提示:复杂场景推荐使用 GORM,其链式调用支持如
db.Where("age > ?", 25).Find(&users)的简洁操作。

被折叠的 条评论
为什么被折叠?



