import contextlib import datetime from redis import Redis from sqlalchemy import ( Column, Integer, DateTime, create_engine, ) from sqlalchemy.orm import ( declarative_base, sessionmaker, ) from utils.logging import logging from config import config engine = create_engine(config.SQLALCHEMY_DATABASE_URI, future=True, pool_pre_ping=True, pool_recycle=3600) Session = sessionmaker(bind=engine, future=True) rds = Redis.from_url(config.BROKER_URL) financial_engine = create_engine(config.FINANCIAL_SQLALCHEMY_DATABASE_URI, future=True) @contextlib.contextmanager def with_session(): s = Session() try: yield s s.commit() except Exception as e: logging.info("failed to commit, start to rollback: %s", e) s.rollback() raise finally: s.close() Base = declarative_base() class BaseMixin: id = Column(Integer, primary_key=True) created_at = Column(DateTime, nullable=False, default=datetime.datetime.now) updated_at = Column(DateTime, nullable=False, default=datetime.datetime.now, onupdate=datetime.datetime.now) deleted_at = Column(DateTime) @classmethod def get_by_id(cls, session, _id): return session.query(cls).filter(cls.id == _id).first() @classmethod def get_all(cls, session): return session.query(cls).all()