diff --git a/app/apis/v0/projects.py b/app/apis/v0/projects.py index 0f9c06f895a79889cd3fc7296738af708bd16388..18c7e40c40e1a44dfbd34e4e1b58efad297c25bf 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 699e5d6641f3566ac74e3640afd46224a07595ae..47565fcd1e205aea5146c12c18a9bf74a703a29e 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 ea5ed65a3c330490c485a8cde0c6edbae6679105..7a905a05b46e038bcc68ded9131567d7a3e5c702 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 0000000000000000000000000000000000000000..03790d34cedebe807574ff697ede4e0665a99657 --- /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 0000000000000000000000000000000000000000..539239d95413ad34c29f38f54092396ed8ef59b2 --- /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 0000000000000000000000000000000000000000..9f541560e83a422ddd004ef20a38fa173c76debe --- /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 a0a6365d2f86e9b713405957f37637ac3b18464e..ab12e2a13b64019538a9a87bf424c3f4dbcb0476 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 4f00b456d63f549a50c65f7d7a608b89a8c1d9bb..416072ab26bda5060d2f2c8b77053117dd05c575 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 ff3b72bf6d76256785aae1f0332ffe55c5155497..e9272b472609c5eddfc48a83d770872b03d73d52 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 74171caca7d5d1a4f5ab6c0c751cba68a246a854..9d0a948505e19f2a6721694021e07b23dc94d336 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 543d4f8a0db191ef65f3347be2318dfaf3ebe994..3ff499e20e86086c71036f68ce2545cdc7ae278e 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')