fix(realestate-lab): 매칭 재계산 DB lock 오류 수정
- sqlite3.connect timeout=10 추가 (기본 0초 → 즉시 실패 방지) - run_matching() 단일 connection으로 통합 (프로필 조회~매칭~저장) - matches/refresh 엔드포인트 에러 핸들링 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -11,7 +11,7 @@ DB_PATH = "/app/data/realestate.db"
|
|||||||
|
|
||||||
|
|
||||||
def _conn():
|
def _conn():
|
||||||
c = sqlite3.connect(DB_PATH)
|
c = sqlite3.connect(DB_PATH, timeout=10)
|
||||||
c.row_factory = sqlite3.Row
|
c.row_factory = sqlite3.Row
|
||||||
c.execute("PRAGMA journal_mode=WAL;")
|
c.execute("PRAGMA journal_mode=WAL;")
|
||||||
c.execute("PRAGMA foreign_keys=ON;")
|
c.execute("PRAGMA foreign_keys=ON;")
|
||||||
|
|||||||
@@ -159,7 +159,11 @@ def api_matches(page: int = Query(1, ge=1), size: int = Query(20, ge=1, le=100))
|
|||||||
|
|
||||||
@app.post("/api/realestate/matches/refresh")
|
@app.post("/api/realestate/matches/refresh")
|
||||||
def api_matches_refresh():
|
def api_matches_refresh():
|
||||||
run_matching()
|
try:
|
||||||
|
run_matching()
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception("매칭 실행 실패")
|
||||||
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
return {"ok": True}
|
return {"ok": True}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
from typing import Dict, Any, List
|
from typing import Dict, Any, List
|
||||||
|
|
||||||
from .db import get_profile, _conn
|
from .db import _conn, _profile_row_to_dict
|
||||||
|
|
||||||
logger = logging.getLogger("realestate-lab")
|
logger = logging.getLogger("realestate-lab")
|
||||||
|
|
||||||
@@ -115,13 +115,16 @@ def _compute_score(
|
|||||||
|
|
||||||
|
|
||||||
def run_matching():
|
def run_matching():
|
||||||
"""프로필 기반 매칭을 실행하여 결과를 저장한다."""
|
"""프로필 기반 매칭을 실행하여 결과를 저장한다.
|
||||||
profile = get_profile()
|
단일 connection으로 프로필 조회 + 매칭 + 저장을 처리하여 DB lock 방지.
|
||||||
if not profile:
|
"""
|
||||||
logger.info("프로필 미설정 — 매칭 건너뜀")
|
|
||||||
return
|
|
||||||
|
|
||||||
with _conn() as conn:
|
with _conn() as conn:
|
||||||
|
profile_row = conn.execute("SELECT * FROM user_profile WHERE id = 1").fetchone()
|
||||||
|
if not profile_row:
|
||||||
|
logger.info("프로필 미설정 — 매칭 건너뜀")
|
||||||
|
return
|
||||||
|
profile = _profile_row_to_dict(profile_row)
|
||||||
|
|
||||||
anns = conn.execute(
|
anns = conn.execute(
|
||||||
"SELECT * FROM announcements WHERE status IN ('청약예정', '청약중')"
|
"SELECT * FROM announcements WHERE status IN ('청약예정', '청약중')"
|
||||||
).fetchall()
|
).fetchall()
|
||||||
|
|||||||
Reference in New Issue
Block a user