def get_backend_manager(self): """Return the database backend manager. .. note:: this is not the actual backend, but a manager class that is necessary for database operations that go around the actual ORM. For example when the schema version has not yet been validated. :return: the database backend manager :rtype: :class:`aiida.backend.manager.BackendManager` """ if self._backend_manager is None: from aiida.backends import get_backend_manager self._backend_manager = get_backend_manager(self.get_profile().database_backend) return self._backend_manager
def _load_backend(self, schema_check: bool = True) -> 'Backend': """Load the backend for the currently configured profile and return it. .. note:: this will reconstruct the `Backend` instance in `self._backend` so the preferred method to load the backend is to call `get_backend` which will create it only when not yet instantiated. :param schema_check: force a database schema check if the database environment has not yet been loaded :return: the database backend """ from aiida.backends import BACKEND_DJANGO, BACKEND_SQLA from aiida.common import ConfigurationError, InvalidOperation from aiida.common.log import configure_logging from aiida.manage import configuration profile = self.get_profile() if profile is None: raise ConfigurationError( 'Could not determine the current profile. Consider loading a profile using `aiida.load_profile()`.' ) if configuration.BACKEND_UUID is not None and configuration.BACKEND_UUID != profile.uuid: raise InvalidOperation( 'cannot load backend because backend of another profile is already loaded' ) # Do NOT reload the backend environment if already loaded, simply reload the backend instance after if configuration.BACKEND_UUID is None: from aiida.backends import get_backend_manager backend_manager = get_backend_manager(profile.database_backend) backend_manager.load_backend_environment( profile, validate_schema=schema_check) configuration.BACKEND_UUID = profile.uuid backend_type = profile.database_backend # Can only import the backend classes after the backend has been loaded if backend_type == BACKEND_DJANGO: from aiida.orm.implementation.django.backend import DjangoBackend self._backend = DjangoBackend() elif backend_type == BACKEND_SQLA: from aiida.orm.implementation.sqlalchemy.backend import SqlaBackend self._backend = SqlaBackend() # Reconfigure the logging with `with_orm=True` to make sure that profile specific logging configuration options # are taken into account and the `DbLogHandler` is configured. configure_logging(with_orm=True) return self._backend
def get_backend_manager(self) -> 'BackendManager': """Return the database backend manager. .. note:: this is not the actual backend, but a manager class that is necessary for database operations that go around the actual ORM. For example when the schema version has not yet been validated. :return: the database backend manager """ from aiida.backends import get_backend_manager from aiida.common import ConfigurationError if self._backend_manager is None: self._load_backend() profile = self.get_profile() if profile is None: raise ConfigurationError( 'Could not determine the current profile. Consider loading a profile using `aiida.load_profile()`.' ) self._backend_manager = get_backend_manager( profile.database_backend) return self._backend_manager