diff options
Diffstat (limited to 'python/report_ops/base.py')
| -rw-r--r-- | python/report_ops/base.py | 43 |
1 files changed, 11 insertions, 32 deletions
diff --git a/python/report_ops/base.py b/python/report_ops/base.py index 367faf50..7517591b 100644 --- a/python/report_ops/base.py +++ b/python/report_ops/base.py @@ -1,43 +1,22 @@ from typing import ClassVar -from dataclasses import Field from serenitas.utils.db2 import dbconn class Report: _sql_insert: ClassVar[str] - _insert_queue: ClassVar[list] - _insert_fields: ClassVar[list] _conn: ClassVar = dbconn("dawndb") + _registry: ClassVar[dict] = {} - def __init_subclass__(cls, table_name: str): - cls._insert_fields = list(filter(cls.is_insert_field, cls.__annotations__)) - place_holders = ",".join(["%s"] * len(cls._insert_fields)) - cls._sql_insert = f"INSERT INTO {table_name}({','.join(cls._insert_fields)}) VALUES({place_holders}) ON CONFLICT DO NOTHING RETURNING *" - cls._insert_queue = [] + def __init_subclass__(cls, table_name: str, columns: tuple[str], **kwargs): + super().__init_subclass__(**kwargs) + place_holders = ",".join(["%s"] * len(columns)) + cls._sql_insert = f"INSERT INTO {table_name}({','.join(columns)}) VALUES({place_holders}) ON CONFLICT DO NOTHING RETURNING *" - @classmethod - def is_insert_field(cls, attr): - """fields are insertable by default unless specified otherwise""" - match getattr(cls, attr, None): - case Field(metadata={"insert": False}) | Field(init=False): - return False - case _: - return True + def __class_getitem__(cls, key): + return cls._registry[key] - @classmethod - def clear(cls): - cls._insert_queue.clear() - - def stage(self): - self._insert_queue.append( - tuple([getattr(self, col) for col in self._insert_fields]) - ) - - @classmethod - def commit(cls): - conn = cls._conn - with conn.cursor() as c: - c.executemany(cls._sql_insert, cls._insert_queue) - conn.commit() - cls._insert_queue.clear() + def commit(self): + with self._conn.cursor() as c: + c.executemany(self._sql_insert, self) + self._conn.commit() |
