본문 바로가기

파이썬으로 로또 1등 도전기

21일차) 로또 제외수와 정확도 표시 기능 추가

@app.route('/get_lotto_numbers')
def get_lotto_numbers():
    round = request.args.get('round')
    connect_to_db()
    try:
        with connection.cursor() as cursor:
            sql = """
            SELECT 
                ll.seq, 
                ll.lucky_numbers, 
                ll.lotto_rank, 
                ll.lucky_yn, 
                re.exclude_numbers,
                re.seq AS lotto_rule_exclude_seq,
                re.percent AS accuracy  -- 정확도 정보를 추가
            FROM lotto_lucky_numbers ll
            LEFT JOIN lotto_rule_exclude_numbers re ON ll.target_lotto_round = re.target_lotto_round
            WHERE ll.target_lotto_round = %s
            ORDER BY 
                CASE ll.lotto_rank 
                    WHEN 1 THEN 1
                    WHEN 2 THEN 2
                    WHEN 3 THEN 3
                    WHEN 4 THEN 4
                    WHEN 5 THEN 5
                    ELSE 6
                END,
                ll.seq ASC
            """
            cursor.execute(sql, (round,))
            rows = cursor.fetchall()

        seen_lucky_numbers = set()
        numbers = []

        for row in rows:
            lucky_numbers = row[1]
            if lucky_numbers not in seen_lucky_numbers:
                seen_lucky_numbers.add(lucky_numbers)
                numbers.append({
                    "seq": row[0], 
                    "luck_numbers": lucky_numbers, 
                    "lotto_rank": row[2], 
                    "lucky_yn": row[3],
                    "exclude_numbers": row[4],
                    "lotto_rule_exclude_seq": row[5],
                    "accuracy": int(row[6]) if row[6] is not None else 0  # None을 0으로 처리
                })

        for number in numbers:
            if number['exclude_numbers']:
                number['exclude_numbers'] = f"(제외수: {number['exclude_numbers']}, 정확도: {number['accuracy']}%)"

        return jsonify({"numbers": numbers})
    finally:
        pass

 

이번엔 로또 애플리케이션에 **제외수의 정확도**를 표시해주는 유용한 기능을 추가해 볼 거예요! 이 기능을 통해 이전 회차 데이터로부터 "제외수"가 얼마나 정확했는지 알 수 있어요. 그럼, 데이터베이스 테이블과 Python 코드로 기능을 구현하는 방법을 살펴볼까요?

---

#### 🏗 Step 1: 제외수 테이블 구성
제외수 데이터를 저장하기 위해 `lotto_rule_exclude_numbers`라는 테이블을 사용해요. 이 테이블에선 각 로또 회차의 제외수와 정확도에 대한 정보가 저장됩니다.

CREATE TABLE `lotto_rule_exclude_numbers` (
  `seq` int NOT NULL AUTO_INCREMENT,
  `target_lotto_round` int NOT NULL,
  `exclude_numbers` varchar(500) NOT NULL,
  `success_numbers` varchar(500) NOT NULL,
  `failure_numbers` varchar(500) NOT NULL,
  `percent` decimal(5,2) NOT NULL
);



- **`exclude_numbers`**: 이번 회차에서 제외하고자 하는 숫자들이 저장돼요.
- **`percent`**: 이 제외수가 과거에 얼마나 "정확"했는지를 백분율로 표시해 줍니다.
- **`success_numbers` & `failure_numbers`**: 이 정확도 퍼센트를 계산하는 데 도움이 되는 성공 및 실패 숫자를 저장할 수 있어요.

이 테이블 구성을 통해 특정 회차의 제외수와 정확도 데이터를 보다 체계적으로 관리할 수 있어요.

---

#### 🧑‍💻 Step 2: 정확도 표시를 위한 Python 코드
제외수와 정확도 정보를 로또 번호 목록에 표시하기 위해 `get_lotto_numbers`라는 함수를 사용해 데이터를 불러오고 포맷을 다듬어줍니다. 



#### 🔍 코드 설명
- **제외수와 정확도 정보**를 `lotto_rule_exclude_numbers` 테이블에서 함께 불러옵니다.
- **정확도 변환**: Python에서 `int(row[6]) if row[6] is not None else 0`을 통해 `None` 값은 `0%`로 처리하여 누락된 값을 보완해요.
- **포맷 설정**: 마지막 단계에서 제외수를 `(정확도: X%)` 형식으로 표시합니다.

---

#### ✨ 최종 출력
이제 사용자가 특정 회차를 선택할 때 제외수와 정확도가 함께 표시됩니다:

> "제외수: 7, 15, 18, 20, 정확도: 80%"

이렇게 표시되면 제외수가 얼마나 신뢰할 만한지 시각적으로 확인하기 쉬워져요!

---

로또 애플리케이션에 이 기능을 추가하면 더욱 유용해질 거예요. 코드 작업을 즐기고, 더욱 알찬 애플리케이션을 만들어 보세요! 🥳