from __future__ import annotations from datetime import datetime import sqlalchemy as sa import sqlalchemy.exc import sqlalchemy.pool from fansifter_common.adapters.db import Database from fansifter_common.adapters.db.models import ModelMixin from fansifter_common.adapters.db.types import NaiveUTCDateTime from fansifter_common.utils.functional import lazy_proxy from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass from app.config import settings def get_db() -> Database: return Database( url=settings.snowflake_url, engine_args={ "echo": settings.snowflake_echo, "poolclass": sqlalchemy.pool.QueuePool, "pool_size": settings.snowflake_pool_size, "max_overflow": settings.snowflake_pool_max_overflow, "pool_recycle": settings.snowflake_pool_recycle, "pool_pre_ping": settings.snowflake_pool_pre_ping, "pool_reset_on_return": settings.snowflake_pool_reset_on_return, "connect_args": settings.snowflake_connect_args, }, ) # Global db instance db = lazy_proxy(get_db) class Model(ModelMixin, MappedAsDataclass, DeclarativeBase): __db__ = db type_annotation_map = { str: sa.Text, datetime: NaiveUTCDateTime, }