59 lines
2.2 KiB
Python
59 lines
2.2 KiB
Python
"""
|
|
테스트 데이터 삭제 스크립트
|
|
재시작 시 오래된 테스트 데이터를 자동으로 삭제합니다.
|
|
"""
|
|
|
|
import asyncio
|
|
import logging
|
|
from sqlalchemy import delete, select
|
|
from datetime import date, timedelta
|
|
|
|
from app.core.database import AsyncSessionLocal
|
|
from app.models.models import StockAnalysis, TradeHistory, Portfolio
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def clear_test_data():
|
|
"""테스트 데이터 및 오래된 분석 데이터 삭제"""
|
|
async with AsyncSessionLocal() as session:
|
|
try:
|
|
# 1. 오래된 stock_analysis 데이터 삭제 (7일 이전)
|
|
cutoff_date = date.today() - timedelta(days=7)
|
|
result = await session.execute(
|
|
delete(StockAnalysis).where(StockAnalysis.analysis_date < cutoff_date)
|
|
)
|
|
deleted_analysis = result.rowcount
|
|
logger.info(f"🗑️ Deleted {deleted_analysis} old stock_analysis records (before {cutoff_date})")
|
|
|
|
# 2. PENDING/FAILED 상태의 오래된 거래 내역 삭제 (1일 이전)
|
|
cutoff_datetime = date.today() - timedelta(days=1)
|
|
result = await session.execute(
|
|
delete(TradeHistory).where(
|
|
TradeHistory.status.in_(['PENDING', 'FAILED']),
|
|
TradeHistory.created_at < cutoff_datetime
|
|
)
|
|
)
|
|
deleted_trades = result.rowcount
|
|
logger.info(f"🗑️ Deleted {deleted_trades} old PENDING/FAILED trade records")
|
|
|
|
# 3. 수량이 0인 포트폴리오 항목 삭제
|
|
result = await session.execute(
|
|
delete(Portfolio).where(Portfolio.quantity <= 0)
|
|
)
|
|
deleted_portfolio = result.rowcount
|
|
logger.info(f"🗑️ Deleted {deleted_portfolio} empty portfolio records")
|
|
|
|
await session.commit()
|
|
logger.info("✅ Test data cleanup completed successfully!")
|
|
|
|
except Exception as e:
|
|
logger.error(f"❌ Error during test data cleanup: {e}")
|
|
await session.rollback()
|
|
raise
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(clear_test_data())
|