@ -61,6 +61,7 @@ class AlpacaPriceService:
rows . append ( {
rows . append ( {
" ticker " : ticker ,
" ticker " : ticker ,
" date " : bar_dt ,
" date " : bar_dt ,
" interval " : interval ,
" open " : float ( bar . get ( " o " , 0 ) ) ,
" open " : float ( bar . get ( " o " , 0 ) ) ,
" high " : float ( bar . get ( " h " , 0 ) ) ,
" high " : float ( bar . get ( " h " , 0 ) ) ,
" low " : float ( bar . get ( " l " , 0 ) ) ,
" low " : float ( bar . get ( " l " , 0 ) ) ,
@ -74,13 +75,16 @@ class AlpacaPriceService:
if not rows :
if not rows :
return 0
return 0
# Batch insert — skip duplicates via ON CONFLICT DO NOTHING
# Batch insert with chunking (14 params/row → CHUNK=2300, 2300× 14=32,200 < 32,767)
stmt = pg_insert ( AlpacaPriceData ) . values ( rows )
CHUNK = 2300
stmt = stmt . on_conflict_do_nothing ( constraint = ' uq_alpaca_price_data ' )
inserted = 0
result = await db . execute ( stmt )
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 ( )
await db . commit ( )
inserted = result . rowcount
if inserted :
if inserted :
logger . info ( f " Alpaca: inserted { inserted } bars for { ticker } " )
logger . info ( f " Alpaca: inserted { inserted } bars for { ticker } " )