53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
"""포트폴리오 수량 0인 종목 정리 스크립트"""
|
|
import asyncio
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from sqlalchemy import select, delete
|
|
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
from sqlalchemy.orm import sessionmaker
|
|
from app.core.config import settings
|
|
from app.models.models import Portfolio
|
|
|
|
async def cleanup():
|
|
# asyncpg 드라이버 사용
|
|
database_url = settings.DATABASE_URL
|
|
if database_url.startswith("postgresql://"):
|
|
database_url = database_url.replace("postgresql://", "postgresql+asyncpg://", 1)
|
|
|
|
engine = create_async_engine(database_url)
|
|
AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
|
|
|
async with AsyncSessionLocal() as session:
|
|
# 수량 0인 종목 조회
|
|
result = await session.execute(
|
|
select(Portfolio).where(Portfolio.quantity == 0)
|
|
)
|
|
zero_qty = result.scalars().all()
|
|
|
|
print(f"수량 0인 종목: {len(zero_qty)}개")
|
|
for p in zero_qty:
|
|
print(f" - {p.stock_name}({p.stock_code}): {p.quantity}주")
|
|
|
|
if zero_qty:
|
|
# 삭제
|
|
await session.execute(
|
|
delete(Portfolio).where(Portfolio.quantity == 0)
|
|
)
|
|
await session.commit()
|
|
print(f"\n✅ {len(zero_qty)}개 종목 삭제 완료")
|
|
else:
|
|
print("\n정리할 종목이 없습니다.")
|
|
|
|
# 최종 포트폴리오 확인
|
|
result = await session.execute(select(Portfolio))
|
|
all_portfolio = result.scalars().all()
|
|
print(f"\n현재 포트폴리오: {len(all_portfolio)}개")
|
|
for p in all_portfolio:
|
|
print(f" - {p.stock_name}({p.stock_code}): {p.quantity}주")
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(cleanup())
|