在Debian系统上使用Golang操作数据库前,需完成以下基础准备:
apt包管理器安装最新稳定版Golang(如sudo apt install golang-go),并通过go version验证安装。go get -u github.com/go-sql-driver/mysql、PostgreSQL用go get -u github.com/lib/pq、SQLite用go get -u modernc.org/sqlite),驱动需与数据库版本兼容。apt安装对应数据库(如sudo apt install mysql-server postgresql),并设置root密码、创建数据库及用户(如CREATE DATABASE mydb; CREATE USER 'user'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'localhost';)。使用database/sql标准库(Go原生支持)结合驱动实现数据库操作,核心步骤如下:
sql.Open初始化连接(驱动名如mysql、postgres,DSN格式为user:password@tcp(host:port)/dbname),并通过db.Ping()验证连接有效性。db.Query执行SELECT语句,通过rows.Scan读取结果(需遍历rows并检查rows.Err());使用db.Exec执行INSERT/UPDATE/DELETE语句(返回Result对象,可通过RowsAffected()获取影响行数)。rows.Close()关闭结果集、db.Close()关闭数据库连接(使用defer确保资源释放)。database/sql内置连接池,合理配置参数可提升性能并避免资源耗尽:
db.SetMaxOpenConns(n)限制同时打开的连接数(建议值为CPU核心数的2-3倍,如4核CPU设为8-12),避免数据库过载。db.SetMaxIdleConns(n)保留空闲连接(建议为最大连接数的一半,如6),减少连接创建延迟。db.SetConnMaxLifetime(d)限制连接的最大存活时间(建议为5-30分钟,如time.Minute*5),避免长期占用数据库资源。对于复杂业务逻辑,使用ORM框架可简化数据库操作。常见框架及实践如下:
AutoMigrate)、查询构建器(链式调用)等功能。示例:定义User结构体(gorm.Model包含ID、CreatedAt等字段),通过db.AutoMigrate(&User{})同步表结构,使用db.Create(&user)插入数据、db.First(&user, 1)查询数据。engine.Sync2(new(User))同步表结构,使用engine.Insert(&user)插入数据、engine.Where("id = ?", 1).Get(&user)查询数据。事务用于保证数据一致性,需遵循ACID原则:
db.Begin()开启事务,返回*sql.Tx对象。tx.Exec、tx.Query),若任一操作失败,调用tx.Rollback()回滚事务。tx.Commit()提交事务。tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
defer func() {
if err != nil {
tx.Rollback()
return
}
err = tx.Commit()
}()
_, err = tx.Exec("UPDATE users SET balance = balance - ? WHERE id = ?", amount, fromID)
if err != nil {
return
}
_, err = tx.Exec("UPDATE users SET balance = balance + ? WHERE id = ?", amount, toID)
db.Prepare预编译SQL(含?占位符),再通过Exec/Query传入参数,防止SQL注入。示例:stmt, err := db.Prepare("SELECT * FROM users WHERE id = ?"); rows, err := stmt.Query(1)。DB_USER、DB_PASSWORD)或配置文件(如.env)中,避免硬编码在代码里。SELECT、INSERT权限,避免DROP等高危操作)。SetConnMaxLifetime日志)记录SQL执行情况,便于排查问题。slow_query_log)定位慢查询,优化SQL语句(如添加索引、重写复杂JOIN)。