建立数据库连接
Go标准库database/sql
为数据库操作提供统一抽象层,支持MySQL、PostgreSQL、SQLite等主流数据库,以下示例展示如何连接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)/mydb?parseTime=true") if err != nil { panic(err.Error()) } defer db.Close() // 验证连接有效性 err = db.Ping() if err != nil { panic(err.Error()) } }
关键点说明:
_ "驱动包"
方式隐式注册数据库驱动sql.Open()
不会立即建立物理连接,实际连接在首次查询时创建Ping()
方法验证连接配置正确性CRUD操作实践
插入数据(Create):
result, err := db.Exec( "INSERT INTO users (name, email) VALUES (?, ?)", "张三", "zhangsan@example.com", ) id, _ := result.LastInsertId()
查询数据(Read):
var user struct { ID int Name string Email string } row := db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", 1) err := row.Scan(&user.ID, &user.Name, &user.Email)
更新数据(Update):
_, err := db.Exec( "UPDATE users SET email = ? WHERE id = ?", "new_email@example.com", 1, )
删除数据(Delete):
_, err := db.Exec("DELETE FROM users WHERE id = ?", 1)
事务处理机制
Go通过Begin()
方法实现事务控制,确保ACID特性:
tx, err := db.Begin() if err != nil { return err } // 事务内操作 _, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", 100, 1) if err != nil { tx.Rollback() return err } _, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", 100, 2) if err != nil { tx.Rollback() return err } // 提交事务 err = tx.Commit()
连接池优化策略database/sql
自带连接池管理,通过以下配置提升性能:
db.SetMaxOpenConns(25) // 最大打开连接数 db.SetMaxIdleConns(10) // 最大空闲连接数 db.SetConnMaxLifetime(5 * time.Minute) // 连接最大存活时间
ORM工具选型建议
虽然标准库足够强大,但复杂场景可考虑ORM方案:
type User struct { gorm.Model Name string Email string `gorm:"uniqueIndex"` }
db.AutoMigrate(&User{})
createdUser := User{Name: “李四”, Email: “lisi@example.com”}
result := db.Create(&createdUser)
---
**最佳实践指南**
1. **预处理语句**:始终使用`Prepare`方法防止SQL注入
2. **错误处理**:对每个数据库操作进行错误检查
3. **上下文控制**:使用`context.Context`实现超时和取消
4. **连接泄露预防**:确保及时关闭`Rows`对象
```go
rows, err := db.Query("SELECT ...")
if err != nil {
// 错误处理
}
defer rows.Close()
性能监控方案
集成Prometheus实现指标采集:
import "github.com/prometheus/client_golang/prometheus" var queryCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "db_queries_total", Help: "数据库查询统计", }, []string{"operation"}, )
通过合理运用Go语言的并发特性和标准库设计,开发者可以构建出高性能、高可靠的数据库应用,建议结合具体业务场景,在原生SQL操作与ORM工具间做出平衡选择,同时持续关注连接管理和错误处理等关键环节。
引用说明:
[1] Go database/sql官方文档 https://pkg.go.dev/database/sql
[2] MySQL驱动文档 https://github.com/go-sql-driver/mysql
[3] PostgreSQL驱动文档 https://pkg.go.dev/github.com/lib/pq
[4] GORM框架文档 https://gorm.io