4c8c879302
- snapshot_admin_store_v1.py: summarize_workspace에서 account_snapshot의 captured_at 사용 (updated_at 대신) - account_snapshot 테이블: 올바른 스키마 재정의 (ordinal PK, row_json, 핵심필드, updated_at) - settings 테이블: 올바른 스키마 재정의 (ordinal PK, key, value_json, note, updated_at) - initialize_snapshot_admin_db.py: XLSX에서 settings, account_snapshot을 올바른 스키마로 로드 - load_from_xlsx_correct.py: account_snapshot을 특별 처리해서 스키마 보존 - /api/settings/save: 정상 작동 (200 응답) - build_ui_state: load_collection_dashboard_state 예외 처리 추가 (진행 중) 데이터 현황: - kis_data_collection.db: 1 테이블 (data_feed), 25행 - snapshot_admin.db: 27 테이블, 7,501행 * settings: 32행 (올바른 스키마) * account_snapshot: 44행 (올바른 스키마) 남은 작업: - /api/state 크래시 원인 진단 및 수정 - /api/export 데이터 검증 - 웹 UI 개선 (백오피스 수준) - T+20 모니터링 활성화 - CI/CD 백업 기능 Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
84 lines
2.3 KiB
Python
84 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
settings 테이블을 올바른 스키마로 수정
|
|
현재: key, value
|
|
목표: ordinal (PK), key (NOT NULL), value_json (JSON), note, updated_at
|
|
"""
|
|
|
|
import sqlite3
|
|
import json
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
|
|
def fix_settings_schema_v2():
|
|
"""settings 테이블 스키마 수정"""
|
|
|
|
db_path = Path('src/quant_engine/snapshot_admin.db')
|
|
conn = sqlite3.connect(db_path)
|
|
conn.row_factory = sqlite3.Row
|
|
cursor = conn.cursor()
|
|
|
|
# 현재 데이터 백업
|
|
cursor.execute("SELECT key, value FROM settings")
|
|
old_rows = cursor.fetchall()
|
|
print(f"현재 settings: {len(old_rows)}개 행")
|
|
|
|
# 기존 테이블 삭제
|
|
cursor.execute("DROP TABLE IF EXISTS settings")
|
|
|
|
# 올바른 스키마로 생성
|
|
cursor.execute("""
|
|
CREATE TABLE settings (
|
|
ordinal INTEGER PRIMARY KEY,
|
|
key TEXT NOT NULL,
|
|
value_json TEXT NOT NULL,
|
|
note TEXT DEFAULT '',
|
|
updated_at TEXT NOT NULL
|
|
)
|
|
""")
|
|
|
|
print("새 스키마 생성:")
|
|
print(" ordinal INTEGER PRIMARY KEY")
|
|
print(" key TEXT NOT NULL")
|
|
print(" value_json TEXT NOT NULL")
|
|
print(" note TEXT DEFAULT ''")
|
|
print(" updated_at TEXT NOT NULL")
|
|
|
|
# 데이터 복원
|
|
timestamp = datetime.now().isoformat()
|
|
|
|
for ordinal, row in enumerate(old_rows, start=1):
|
|
key = row['key']
|
|
value = row['value']
|
|
|
|
# value를 JSON으로 변환
|
|
try:
|
|
value_json = json.dumps(str(value), ensure_ascii=False)
|
|
except:
|
|
value_json = json.dumps("", ensure_ascii=False)
|
|
|
|
cursor.execute("""
|
|
INSERT INTO settings (ordinal, key, value_json, note, updated_at)
|
|
VALUES (?, ?, ?, ?, ?)
|
|
""", (ordinal, key, value_json, "", timestamp))
|
|
|
|
conn.commit()
|
|
|
|
# 검증
|
|
cursor.execute("SELECT COUNT(*) FROM settings")
|
|
count = cursor.fetchone()[0]
|
|
print(f"\n복원된 settings: {count}개 행")
|
|
|
|
cursor.execute("SELECT ordinal, key, value_json FROM settings LIMIT 3")
|
|
print("샘플 데이터:")
|
|
for ordinal, key, value_json in cursor.fetchall():
|
|
value = json.loads(value_json)
|
|
print(f" {ordinal}. {key} = {value}")
|
|
|
|
conn.close()
|
|
|
|
print(f"\n[OK] settings 테이블 스키마 수정 완료")
|
|
|
|
if __name__ == "__main__":
|
|
fix_settings_schema_v2()
|