fix(prediction): features JSONB 중첩 구조 sanitize

AnalysisResult.to_db_tuple이 기존에 features dict 값을 모두 float로
변환했는데, dark_suspicion 구조를 넣으면서 dark_patterns(list) 등
비스칼라 타입이 포함되어 upsert 실패 (float argument not a list).

_sanitize 재귀 함수로 JSON 호환 타입(str/int/float/bool/list/dict/None)을
그대로 보존하도록 변경.
This commit is contained in:
htlee 2026-04-09 07:56:04 +09:00
부모 e5d123e4c5
커밋 dac4a3bda2

파일 보기

@ -70,8 +70,24 @@ class AnalysisResult:
"""numpy int → Python int 변환."""
return int(v) if v is not None else 0
# features dict 내부 numpy 값도 변환
safe_features = {k: float(v) for k, v in self.features.items()} if self.features else {}
# features dict 내부 numpy 값도 변환 (재귀적 처리)
# int/float/bool/str/None/list/dict 모두 허용 (JSON 호환 타입만 유지)
def _sanitize(v):
if v is None or isinstance(v, (str, bool)):
return v
if isinstance(v, (int, float)):
return float(v) if isinstance(v, float) else int(v)
if isinstance(v, dict):
return {str(k): _sanitize(val) for k, val in v.items()}
if isinstance(v, (list, tuple)):
return [_sanitize(x) for x in v]
# numpy 스칼라 등은 float 변환 시도, 실패 시 str
try:
return float(v)
except (TypeError, ValueError):
return str(v)
safe_features = _sanitize(self.features) if self.features else {}
return (
str(self.mmsi),