"""측정 도구용 DB 읽기 — **비밀번호를 코드에 안 적는다** (2026-08-29).

## 왜 만들었나

갤러리·조사 도구 넷이 `psql` 을 셸로 부르면서 `PGPASSWORD=<평문>` 을
그대로 박고 있었다. GitGuardian 이 PR 을 세웠고, 그게 맞다 — 저장소의
다른 코드는 전부 `settings.database_url` 로 붙는데 내 도구만 비밀번호를
따로 적어 두고 있었다. 접속 정보는 **한 군데(설정)** 에서만 온다.

소비처가 넷이라 여기 모은다(하나였으면 안 만들었다).
"""
from __future__ import annotations

from typing import Any, List, Sequence, Tuple


def rows(sql: str, params: dict | None = None) -> List[Tuple[Any, ...]]:
    """읽기 전용 조회 — `settings.database_url` 로 붙는다.

    값은 **파라미터로** 넘긴다(`:name`). 문자열을 이어 붙이면 따옴표
    하나로 조회가 깨지고, 그때 0건이 나오면 「없다」로 잘못 읽는다.
    """
    from sqlalchemy import create_engine, text

    from app.core.config import settings

    eng = create_engine(settings.database_url)
    try:
        with eng.connect() as conn:
            return [tuple(r) for r in conn.execute(text(sql), params or {})]
    finally:
        eng.dispose()


def one_col(sql: str, params: dict | None = None) -> Sequence[Any]:
    """한 칸짜리 조회를 평평한 목록으로."""
    return [r[0] for r in rows(sql, params)]
