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") 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 = [] @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 @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()