diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/trade_dataclasses.py | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py index 37d0ead6..6dcf21df 100644 --- a/python/trade_dataclasses.py +++ b/python/trade_dataclasses.py @@ -158,21 +158,25 @@ class Deal: _cache: ClassVar[LRU] = LRU(128) _bbg_sql_insert: ClassVar[str] - def __init_subclass__(cls, table_name: str): + def __init_subclass__(cls, table_name: str, insert_ignore=()): super().__init_subclass__() cls._table_name = table_name - cls._sql_fields = list(cls.__annotations__) - _sql_insert_fields = list( - c for c in cls.__annotations__ if c not in ("id", "dealid") + insert_columns = [c for c in cls.__annotations__ if c not in insert_ignore] + place_holders = ",".join(["%s"] * len(insert_columns)) + + cls._sql_insert = f"INSERT INTO {cls._table_name}({','.join(insert_columns)}) VALUES({place_holders})" + cls._sql_select = ( + f"SELECT {','.join(cls.__annotations__)} FROM {cls._table_name} WHERE id=%s" ) - insert_place_holders = ",".join(["%s"] * len(_sql_insert_fields)) - insert_columns = ",".join(c for c in _sql_insert_fields) - select_columns = ",".join(c for c in cls._sql_fields) - cls._sql_insert = f"INSERT INTO {cls._table_name}({insert_columns}) VALUES({insert_place_holders})" - cls._sql_select = f"SELECT {select_columns} FROM {cls._table_name} WHERE id=%s" def stage(self): - self._insert_queue.append([getattr(self, f) for f in self._sql_fields]) + self._insert_queue.append( + [ + getattr(self, f.name) + for f in fields(self) + if f.metadata.get("insert", True) + ] + ) @classmethod def commit(cls): @@ -191,10 +195,7 @@ class Deal: @dataclass -class CDSDeal(Deal, table_name="cds"): - id: field(default=None) - dealid: field(default=None) - initial_margin_percentage: field(default=None) +class CDSDeal(Deal, table_name="cds", insert_ignore=("id", "dealid")): fund: Fund account_code: str cp_code: str @@ -220,6 +221,8 @@ class CDSDeal(Deal, table_name="cds"): swap_type: SwapType = "CD_INDEX" clearing_facility: ClearingFacility = "ICE-CREDIT" isda_definition: IsdaDoc = "ISDA2014" + id: int = field(default=None, metadata={"insert": False}) + dealid: str = field(default=None, metadata={"insert": False}) def __post_init__(self): self.effective_date = previous_twentieth(self.trade_date) |
