import atexit import calendar from datetime import datetime from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from common.common import CostDetail from sink.model.o11ycost import O11yCost engine = None def s2ts(date: str): return calendar.timegm(datetime.strptime(date, "%Y-%m-%d").utctimetuple()) def write(database_url: str, cost_details: list[CostDetail]): # init engine global engine if engine is None: engine = create_engine(database_url) # init session Session = sessionmaker(bind=engine) session = Session() try: # write to db for cost_detail in cost_details: timestamp = s2ts(cost_detail.date) cloud_resource_cost = O11yCost( provider=cost_detail.provider, region=cost_detail.region, cloud_service=cost_detail.cloud_service, inner_cloud_service=cost_detail.inner_cloud_service, fixed_cost=cost_detail.fixed_cost, cost=cost_detail.cost, timestamp=timestamp, ) session.merge(cloud_resource_cost) # merge will update if exists session.commit() except Exception: session.rollback() raise finally: session.close() def close(): global engine if engine is not None: engine.dispose() engine = None atexit.register(close)