database/sql로 만든 작은 도구가 목록을 반만 돌려줬어. 에러 없이. 코드는 이래.
func names(ctx context.Context, db *sql.DB) ([]string, error) {
rows, err := db.QueryContext(ctx, `SELECT name FROM users ORDER BY id`)
if errors.Is(err, sql.ErrNoRows) {
return nil, nil
}
if err != nil {
return nil, fmt.Errorf("users: %w", err)
}
defer rows.Close()
var out []string
for rows.Next() {
var n string
if err := rows.Scan(&n); err != nil {
return nil, fmt.Errorf("scan: %w", err)
}
out = append(out, n)
}
return out, nil
}
컨텍스트에 데드라인이 있었어. 가져오는 도중에 데드라인이 지나서 rows.Next()가 false를 줬고, 루프가 끝났고, 함수는 모은 것까지만 nil이랑 같이 넘겼어. 에러는 rows.Err()에 들어 있었는데 아무도 안 물어봤지.
고치는 건 루프 뒤 두 줄. if err := rows.Err(); err != nil 그리고 %w로 감싸서 반환. 끝. 이제 비슷한 루프를 나머지 코드에서 찾는 중이야.