From 5bcba8632ca91a182e6a40f43ab95977aa48872e Mon Sep 17 00:00:00 2001 From: I Luk Kim Date: Tue, 14 Apr 2026 03:11:48 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20fetch=5Fand=5Fstore=5Fbars()=20interval?= =?UTF-8?q?=20=EC=BB=AC=EB=9F=BC=20=EC=B6=94=EA=B0=80=20+=20CHUNK=20?= =?UTF-8?q?=EB=B6=84=ED=95=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - interval 누락으로 uq_alpaca_price_data constraint 위반 방지 - 단일 INSERT → CHUNK=2300 분할 (14 params/row, asyncpg 한도 대비) Co-Authored-By: Claude Sonnet 4.6 --- app/services/alpaca_price_service.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/services/alpaca_price_service.py b/app/services/alpaca_price_service.py index 3ee5c51..16a6ee9 100644 --- a/app/services/alpaca_price_service.py +++ b/app/services/alpaca_price_service.py @@ -61,6 +61,7 @@ class AlpacaPriceService: rows.append({ "ticker": ticker, "date": bar_dt, + "interval": interval, "open": float(bar.get("o", 0)), "high": float(bar.get("h", 0)), "low": float(bar.get("l", 0)), @@ -74,13 +75,16 @@ class AlpacaPriceService: if not rows: return 0 - # Batch insert — skip duplicates via ON CONFLICT DO NOTHING - stmt = pg_insert(AlpacaPriceData).values(rows) - stmt = stmt.on_conflict_do_nothing(constraint='uq_alpaca_price_data') - result = await db.execute(stmt) + # Batch insert with chunking (14 params/row → CHUNK=2300, 2300×14=32,200 < 32,767) + CHUNK = 2300 + inserted = 0 + for i in range(0, len(rows), CHUNK): + stmt = pg_insert(AlpacaPriceData).values(rows[i : i + CHUNK]) + stmt = stmt.on_conflict_do_nothing(constraint='uq_alpaca_price_data') + result = await db.execute(stmt) + inserted += result.rowcount await db.commit() - inserted = result.rowcount if inserted: logger.info(f"Alpaca: inserted {inserted} bars for {ticker}")