import logging from psycopg import sql logger = logging.getLogger(__name__) def insert_ir_portfolio(portf, conn): cols = [ "date", "swpt_id", "notional", "pv", "vol", "vol_type", "DV01", "IRGamma1bp", "vega", ] sql_str = sql.SQL( "INSERT INTO ir_swaption_risk({columns}) " "VALUES({placeholders}) " " ON CONFLICT (date, swpt_id) DO UPDATE " "SET {update_str}" ).format( columns=sql.SQL(",").join([sql.Identifier(c) for c in cols]), placeholders=sql.SQL(",").join([sql.Placeholder()] * len(cols)), update_str=sql.SQL(",").join( [ sql.SQL("{c} = EXCLUDED.{c}").format(c=sql.Identifier(c)) for c in cols[2:] ] ), ) with conn.cursor() as c: for trade_id, trade in portf.items(): logger.info(f"marking IR swaption {trade_id}") c.execute( sql_str, ( trade.value_date, trade_id, trade.notional, trade.pv, trade.implied_vol, trade._vol_type.name, trade.DV01, trade.IRGamma1bp, trade.vega, ), ) conn.commit()