mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 18:07:44 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			42 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Database module."""
 | 
						|
 | 
						|
from contextlib import contextmanager, AbstractContextManager
 | 
						|
from typing import Callable
 | 
						|
import logging
 | 
						|
 | 
						|
from sqlalchemy import create_engine, orm
 | 
						|
from sqlalchemy.ext.declarative import declarative_base
 | 
						|
from sqlalchemy.orm import Session
 | 
						|
 | 
						|
logger = logging.getLogger(__name__)
 | 
						|
 | 
						|
Base = declarative_base()
 | 
						|
 | 
						|
 | 
						|
class Database:
 | 
						|
 | 
						|
    def __init__(self, db_url: str) -> None:
 | 
						|
        self._engine = create_engine(db_url, echo=True)
 | 
						|
        self._session_factory = orm.scoped_session(
 | 
						|
            orm.sessionmaker(
 | 
						|
                autocommit=False,
 | 
						|
                autoflush=False,
 | 
						|
                bind=self._engine,
 | 
						|
            ),
 | 
						|
        )
 | 
						|
 | 
						|
    def create_database(self) -> None:
 | 
						|
        Base.metadata.create_all(self._engine)
 | 
						|
 | 
						|
    @contextmanager
 | 
						|
    def session(self) -> Callable[..., AbstractContextManager[Session]]:
 | 
						|
        session: Session = self._session_factory()
 | 
						|
        try:
 | 
						|
            yield session
 | 
						|
        except Exception:
 | 
						|
            logger.exception("Session rollback because of exception")
 | 
						|
            session.rollback()
 | 
						|
            raise
 | 
						|
        finally:
 | 
						|
            session.close()
 |