Source code for tvb.config.init.model_manager

# -*- coding: utf-8 -*-
#
#
# TheVirtualBrain-Framework Package. This package holds all Data Management, and
# Web-UI helpful to run brain-simulations. To use it, you also need to download
# TheVirtualBrain-Scientific Package (for simulators). See content of the
# documentation-folder for more details. See also http://www.thevirtualbrain.org
#
# (c) 2012-2023, Baycrest Centre for Geriatric Care ("Baycrest") and others
#
# This program is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.  See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with this
# program.  If not, see <http://www.gnu.org/licenses/>.
#
#
#   CITATION:
# When using The Virtual Brain for scientific publications, please cite it as explained here:
# https://www.thevirtualbrain.org/tvb/zwei/neuroscience-publications
#
#

"""
.. moduleauthor:: Lia Domide <lia.domide@codemart.ro>
.. moduleauthor:: Yann Gordon <yann@invalid.tvb>
"""
import os
import shutil

import tvb.config.init.alembic.versions as scripts
from alembic import command
from alembic.config import Config
from sqlalchemy import inspect
from sqlalchemy.sql import text
from tvb.basic.logger.builder import get_logger
from tvb.basic.profile import TvbProfile
from tvb.core.entities.storage import SA_SESSIONMAKER
from tvb.core.neotraits.db import Base

LOGGER = get_logger(__name__)


[docs]def initialize_startup(): """ Force DB tables create, in case no data is already found.""" is_db_empty = False session = SA_SESSIONMAKER() inspector = inspect(session.connection()) table_names = inspector.get_table_names() if len(table_names) < 1: LOGGER.debug("Database access exception, maybe DB is empty") is_db_empty = True session.close() versions_repo = TvbProfile.current.db.DB_VERSIONING_REPO alembic_cfg = Config() alembic_cfg.set_main_option('script_location', versions_repo) alembic_cfg.set_main_option('sqlalchemy.url', TvbProfile.current.db.DB_URL) if is_db_empty: LOGGER.info("Initializing Database") if os.path.exists(versions_repo): shutil.rmtree(versions_repo) _update_sql_scripts() session = SA_SESSIONMAKER() Base.metadata.create_all(bind=session.connection()) session.commit() session.close() command.stamp(alembic_cfg, 'head') LOGGER.info("Database Default Tables created successfully!") else: _update_sql_scripts() if 'migrate_version' in table_names: db_version = session.execute(text("""SELECT version from migrate_version""")).fetchone()[0] if db_version == 18: command.stamp(alembic_cfg, 'head') session.execute(text("""DROP TABLE "migrate_version";""")) session.commit() return is_db_empty if 'alembic_version' in table_names: db_version = session.execute(text("""SELECT version_num from alembic_version""")).fetchone() if not db_version: command.stamp(alembic_cfg, 'head') with session.connection() as connection: alembic_cfg.attributes['connection'] = connection command.upgrade(alembic_cfg, TvbProfile.current.version.DB_STRUCTURE_VERSION) LOGGER.info("Database already has some data, will not be re-created!") # Alembic throws an error if we use alembic_cfg with a connection that has been already closed del alembic_cfg.attributes['connection'] command.stamp(alembic_cfg, 'head') return is_db_empty
[docs]def reset_database(): """ Remove all tables in DB. """ LOGGER.warning("Your Database tables will be deleted.") try: session = SA_SESSIONMAKER() LOGGER.debug("Delete connection initiated.") inspector = inspect(session.connection()) for table in inspector.get_table_names(): try: LOGGER.debug("Removing:" + table) session.execute(text("DROP TABLE \"%s\" CASCADE" % table)) except Exception: try: session.execute(text("DROP TABLE %s" % table)) except Exception as excep1: LOGGER.error("Could no drop table %s", table) LOGGER.exception(excep1) session.commit() LOGGER.info("Database was cleanup!") except Exception as excep: LOGGER.warning(excep) finally: session.close()
def _update_sql_scripts(): """ When a new release is done, make sure old DB scripts are updated. """ scripts_folder = os.path.dirname(scripts.__file__) versions_folder = os.path.join(TvbProfile.current.db.DB_VERSIONING_REPO, 'versions') if os.path.exists(versions_folder): shutil.rmtree(versions_folder) ignore_patters = shutil.ignore_patterns('.svn') shutil.copytree(scripts_folder, versions_folder, ignore=ignore_patters) shutil.copyfile(os.path.join(os.path.dirname(__file__), 'alembic/env.py'), os.path.join(versions_folder, os.pardir, 'env.py'))