fix(seed): SEED 10종목 항상 보장 + KRX 실패 graceful degrade + 수동 reseed API
문제: 빌드/기동은 성공했는데 종목 검색 결과 빈 화면. 원인은 시드 트랜잭션
구조 — `_fetch_market_listing(KRX)` 가 `with engine.begin()` 블록 *밖*에서
호출되고, 컨테이너에서 KRX 서버 접근이 실패하거나 단일 ticker 처리 중
한 곳이라도 예외가 나면 전체 트랜잭션이 롤백되어 SEED_TICKERS 10개조차
들어가지 않음.
수정:
- `_upsert_seed_tickers()` 분리. SEED 10종목 전용 트랜잭션. 네트워크 무관.
- `seed_symbols()` 가 (1) SEED 먼저 → (2) KRX 시장별 fetch (try-per-market)
→ (3) 전 종목 bulk upsert (별도 트랜잭션) 순서로 동작. KRX fetch 실패해도
SEED 는 살아남음.
- `main.py` lifespan bootstrap 이 SEED upsert 를 매 부팅마다 무조건 실행
(10회, ms 단위, idempotent). count <= 10 일 때만 KRX 전 종목 fetch.
- 새 admin 엔드포인트 `POST /api/refresh/seed/symbols` — 컨테이너 재기동
없이 시드 재시도 가능.
이번 사례 (사금향 PC) 의 복구 절차:
curl -X POST http://localhost:8000/api/refresh/seed/symbols
이후 검색에 SEED 10 종목은 즉시 떠야 함. KRX 가 막힌 환경이면 markets={0,0}
가 응답에 찍히고, 그래도 SEED 만으로 핵심 동작은 가능.
This commit is contained in:
@@ -48,19 +48,26 @@ def _bootstrap_db() -> None:
|
||||
logger.exception("bootstrap migrate failed")
|
||||
return # 스키마 없으면 시드 불가
|
||||
|
||||
# 2) symbols 시드 (비어있을 때만 — pykrx 호출이 비싸므로 항상 돌리지 않음)
|
||||
# 2) symbols 시드
|
||||
# - SEED 10종목은 매 부팅마다 무조건 upsert (10회 upsert, ms 단위, 네트워크 무관)
|
||||
# → KRX 접근 실패한 환경에서도 최소 10종목 검색 보장
|
||||
# - KRX 전 종목 fetch 는 symbols 가 비어있을 때만 (호출 비용 큼)
|
||||
try:
|
||||
from app.fetch.symbols_seed import _upsert_seed_tickers, seed_symbols
|
||||
n_seed = _upsert_seed_tickers()
|
||||
logger.info("bootstrap seed-tickers ensured (%d)", n_seed)
|
||||
|
||||
eng = get_engine()
|
||||
with eng.connect() as conn:
|
||||
row = conn.execute(text("SELECT COUNT(*) FROM symbols")).first()
|
||||
count = int(row[0]) if row else 0
|
||||
if count == 0:
|
||||
logger.info("symbols empty — running initial seed")
|
||||
from app.fetch.symbols_seed import seed_symbols
|
||||
if count <= n_seed:
|
||||
# symbols 가 SEED 만큼 또는 그 이하 → KRX 전 종목 fetch 시도
|
||||
logger.info("symbols sparse (count=%d) — running KRX listing seed", count)
|
||||
report = seed_symbols()
|
||||
logger.info("bootstrap seed_symbols: %s", report)
|
||||
else:
|
||||
logger.info("symbols already populated (count=%d) — skip seed", count)
|
||||
logger.info("symbols already populated (count=%d) — skip KRX listing seed", count)
|
||||
except Exception: # noqa: BLE001
|
||||
logger.exception("bootstrap seed_symbols failed")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user