package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql" // 这里以mysql为例,实际根据所用数据库替换
)
// 获取用户操作记录
func GetUserOperationRecords(db *sql.DB, userIDs []string) ([]string, error) {
if len(userIDs) > 100 {
return nil, fmt.Errorf("用户ID数量超过100个")
}
for _, id := range userIDs {
if len(id) < 6 || len(id) > 18 {
return nil, fmt.Errorf("用户ID长度不在6到18个字符之间")
}
}
var records []string
for _, id := range userIDs {
var record string
err := db.QueryRow("SELECT operation_record FROM user_operations WHERE user_id =?", id).Scan(&record)
if err != nil {
if err == sql.ErrNoRows {
// 记录日志,用户ID存在但无操作记录
log.Printf("用户ID %s 无操作记录", id)
} else {
// 数据库查询错误,记录日志并返回错误
log.Printf("查询用户ID %s 操作记录时出错: %v", id, err)
return nil, fmt.Errorf("查询用户ID %s 操作记录时出错: %v", id, err)
}
} else {
records = append(records, record)
}
}
return records, nil
}
错误处理说明
- 参数校验错误:在函数开始时,对传入的用户ID数量和每个用户ID的长度进行校验。如果不满足条件,直接返回相应的错误信息,这样可以避免无效参数进入后续复杂的数据库操作流程,保证系统的健壮性。
- 数据库操作错误:在执行数据库查询时,捕获可能出现的错误。如果是
sql.ErrNoRows
错误,表示用户ID存在但无操作记录,此时记录日志并继续处理下一个用户ID。如果是其他数据库查询错误,记录详细的错误日志并返回错误,以便上层调用者进行处理。通过这种方式,既保证了单个用户ID操作记录查询失败不影响其他用户ID的处理,又能将关键错误信息反馈给调用者,使系统在面对数据库异常时保持健壮性。