From 8be7a97c79d04ca4d3a3676345432f582f6a5124 Mon Sep 17 00:00:00 2001 From: Pierre Chanial <pierre.chanial@ego-gw.it> Date: Thu, 22 Jul 2021 23:49:03 +0200 Subject: [PATCH] Refactoring: split db directory into dbadmin and dbprojects. --- app/apis/v0/projects.py | 2 +- app/apis/v0/users.py | 2 +- app/db/__init__.py | 10 ++++------ app/db/dbadmin/__init__.py | 10 ++++++++++ app/db/{ => dbadmin}/models.py | 0 app/db/dbadmin/sessions.py | 13 +++++++++++++ app/db/dbprojects/__init__.py | 1 + app/db/{access.py => dbprojects/engines.py} | 14 ++------------ migrations/env.py | 2 +- scripts/initialize_dbadmin.py | 3 ++- scripts/wait_for_initialized_dbadmin.py | 3 ++- tests/conftest.py | 2 +- 12 files changed, 38 insertions(+), 24 deletions(-) create mode 100644 app/db/dbadmin/__init__.py rename app/db/{ => dbadmin}/models.py (100%) create mode 100644 app/db/dbadmin/sessions.py create mode 100644 app/db/dbprojects/__init__.py rename app/db/{access.py => dbprojects/engines.py} (76%) diff --git a/app/apis/v0/projects.py b/app/apis/v0/projects.py index 0f9c06f..18c7e40 100644 --- a/app/apis/v0/projects.py +++ b/app/apis/v0/projects.py @@ -8,7 +8,7 @@ from sqlalchemy.exc import DBAPIError from sqlalchemy.future import select from sqlalchemy.orm import Session -from ...db import DBProject, DBProjectServer +from ...db.dbadmin import DBProject, DBProjectServer from ...helpers import fix_sqlalchemy2_stubs_non_nullable_column from ...schemas import Project from ..depends import get_session, get_session_as_you_go diff --git a/app/apis/v0/users.py b/app/apis/v0/users.py index 699e5d6..47565fc 100644 --- a/app/apis/v0/users.py +++ b/app/apis/v0/users.py @@ -4,7 +4,7 @@ import logging from fastapi import APIRouter, Depends from sqlalchemy.orm import Session -from ...db import DBUser +from ...db.dbadmin import DBUser from ...schemas import User from ..depends import get_session diff --git a/app/db/__init__.py b/app/db/__init__.py index ea5ed65..7a905a0 100644 --- a/app/db/__init__.py +++ b/app/db/__init__.py @@ -1,11 +1,9 @@ -"""The ESAP-DB module handling the admin database.""" -from .access import AdminSession, project_engines -from .models import DBProject, DBProjectServer, DBUser +"""Accessors to the admin or project databases.""" + +from .dbadmin import AdminSession +from .dbprojects.engines import project_engines __all__ = ( 'AdminSession', - 'DBProject', - 'DBProjectServer', - 'DBUser', 'project_engines', ) diff --git a/app/db/dbadmin/__init__.py b/app/db/dbadmin/__init__.py new file mode 100644 index 0000000..03790d3 --- /dev/null +++ b/app/db/dbadmin/__init__.py @@ -0,0 +1,10 @@ +"""The ESAP-DB module handling the admin database.""" +from .models import DBProject, DBProjectServer, DBUser +from .sessions import AdminSession + +__all__ = ( + 'AdminSession', + 'DBProject', + 'DBProjectServer', + 'DBUser', +) diff --git a/app/db/models.py b/app/db/dbadmin/models.py similarity index 100% rename from app/db/models.py rename to app/db/dbadmin/models.py diff --git a/app/db/dbadmin/sessions.py b/app/db/dbadmin/sessions.py new file mode 100644 index 0000000..539239d --- /dev/null +++ b/app/db/dbadmin/sessions.py @@ -0,0 +1,13 @@ +"""This module provides factories to access the admin and project databases. + +An instance of this class can be used to connect the admin or a project database. +""" +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from ...config import settings + +assert settings.SQLALCHEMY_DBADMIN_URI is not None + +engine = create_engine(settings.SQLALCHEMY_DBADMIN_URI, pool_pre_ping=True, future=True) +AdminSession = sessionmaker(autocommit=False, autoflush=False, bind=engine, future=True) diff --git a/app/db/dbprojects/__init__.py b/app/db/dbprojects/__init__.py new file mode 100644 index 0000000..9f54156 --- /dev/null +++ b/app/db/dbprojects/__init__.py @@ -0,0 +1 @@ +"""The ESAP-DB module handling the project databases.""" diff --git a/app/db/access.py b/app/db/dbprojects/engines.py similarity index 76% rename from app/db/access.py rename to app/db/dbprojects/engines.py index a0a6365..ab12e2a 100644 --- a/app/db/access.py +++ b/app/db/dbprojects/engines.py @@ -1,7 +1,4 @@ -"""This module provides factories to access the admin and project databases. - -An instance of this class can be used to connect the admin or a project database. -""" +"""Factory for the SQLAlchemy engines of the projects, with a caching mechanism.""" import collections from typing import Iterator @@ -9,15 +6,8 @@ from fastapi import HTTPException, status from sqlalchemy import create_engine from sqlalchemy.engine import Engine from sqlalchemy.future import select -from sqlalchemy.orm import sessionmaker - -from ..config import settings -from .models import DBProject - -assert settings.SQLALCHEMY_DBADMIN_URI is not None -engine = create_engine(settings.SQLALCHEMY_DBADMIN_URI, pool_pre_ping=True, future=True) -AdminSession = sessionmaker(autocommit=False, autoflush=False, bind=engine, future=True) +from ..dbadmin import AdminSession, DBProject class ProjectEngines(collections.abc.Mapping): diff --git a/migrations/env.py b/migrations/env.py index 4f00b45..416072a 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -13,7 +13,7 @@ from sqlalchemy import engine_from_config, pool # from myapp import mymodel # target_metadata = mymodel.Base.metadata from app.config import settings -from app.db import models +from app.db.dbadmin import models BASE_DIR = Path(__file__).parents[1].absolute() load_dotenv(BASE_DIR / '.env') diff --git a/scripts/initialize_dbadmin.py b/scripts/initialize_dbadmin.py index ff3b72b..e9272b4 100644 --- a/scripts/initialize_dbadmin.py +++ b/scripts/initialize_dbadmin.py @@ -4,7 +4,8 @@ import logging from sqlalchemy.exc import IntegrityError from app.config import settings -from app.db import AdminSession, DBProjectServer +from app.db import AdminSession +from app.db.dbadmin import DBProjectServer logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) diff --git a/scripts/wait_for_initialized_dbadmin.py b/scripts/wait_for_initialized_dbadmin.py index 74171ca..9d0a948 100644 --- a/scripts/wait_for_initialized_dbadmin.py +++ b/scripts/wait_for_initialized_dbadmin.py @@ -4,7 +4,8 @@ import logging from sqlalchemy import select from tenacity import after_log, before_log, retry, stop_after_attempt, wait_fixed -from app.db import AdminSession, DBProjectServer +from app.db import AdminSession +from app.db.dbadmin import DBProjectServer logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) diff --git a/tests/conftest.py b/tests/conftest.py index 543d4f8..3ff499e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,7 +3,7 @@ from typing import Generator import pytest from sqlalchemy.orm import Session -from app.db.access import AdminSession +from app.db import AdminSession @pytest.fixture(scope='session') -- GitLab