mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2024-12-04 23:44:05 +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()
|