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:
부모
e5d123e4c5
커밋
dac4a3bda2
@ -70,8 +70,24 @@ class AnalysisResult:
|
|||||||
"""numpy int → Python int 변환."""
|
"""numpy int → Python int 변환."""
|
||||||
return int(v) if v is not None else 0
|
return int(v) if v is not None else 0
|
||||||
|
|
||||||
# features dict 내부 numpy 값도 변환
|
# features dict 내부 numpy 값도 변환 (재귀적 처리)
|
||||||
safe_features = {k: float(v) for k, v in self.features.items()} if self.features else {}
|
# 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 (
|
return (
|
||||||
str(self.mmsi),
|
str(self.mmsi),
|
||||||
|
|||||||
불러오는 중...
Reference in New Issue
Block a user