import asyncio from app.core.database import AsyncSessionLocal from app.models.models import TradeHistory, Portfolio from sqlalchemy import select, and_ async def fix_trade_history(): """잘못된 거래 내역 수정""" async with AsyncSessionLocal() as db: # 현대ADM 포트폴리오 확인 result = await db.execute( select(Portfolio).where(Portfolio.stock_code == "187660") ) portfolio = result.scalar_one_or_none() if portfolio: actual_qty = portfolio.quantity print(f"✅ 실제 보유 수량: {actual_qty}주") else: print("❌ 포트폴리오에 현대ADM 없음") return # 현대ADM 거래 내역 조회 result = await db.execute( select(TradeHistory) .where( and_( TradeHistory.stock_code == "187660", TradeHistory.order_type == "BUY", TradeHistory.status.in_(["COMPLETED", "EXECUTED"]) ) ) .order_by(TradeHistory.created_at) ) trades = result.scalars().all() print(f"\n📋 DB 거래 내역: {len(trades)}건") total_db_qty = sum(t.executed_quantity or t.order_quantity for t in trades) print(f"📊 DB 총 매수량: {total_db_qty}주") print(f"📊 실제 보유량: {actual_qty}주") print(f"⚠️ 차이: {total_db_qty - actual_qty}주") # 가장 최근 거래만 남기고 나머지 삭제 if len(trades) > 1: print(f"\n🗑️ 중복 거래 내역 삭제:") for trade in trades[:-1]: # 마지막 거래 제외하고 삭제 print(f" - ID {trade.id}: {trade.order_quantity}주 (생성: {trade.created_at})") await db.delete(trade) # 마지막 거래의 수량을 실제 보유량으로 수정 last_trade = trades[-1] print(f"\n✏️ 마지막 거래 수량 수정:") print(f" - ID {last_trade.id}: {last_trade.order_quantity}주 → {actual_qty}주") last_trade.executed_quantity = actual_qty last_trade.order_quantity = actual_qty await db.commit() print(f"\n✅ 수정 완료!") else: print("\n✅ 중복 없음") if __name__ == "__main__": asyncio.run(fix_trade_history())