Beispiel #1
0
    def __init__(
        self,  # noqa pylint: disable=too-many-arguments
        db: peewee.Database,
        fields: Sequence[Type[peewee.Field]],
        models: Sequence[Type[peewee.Model]],
        db_dir: str,
        db_name: str = 'golem.db',
        schemas_dir: Optional[str] = default_migrate_dir()
    ) -> None:

        self.fields = fields
        self.models = models
        self.schemas_dir = schemas_dir

        if not os.path.exists(db_dir):
            os.makedirs(db_dir)

        self.db = db
        self.db.init(os.path.join(db_dir, db_name))
        self.db.connect()

        version = self.get_user_version()

        if not version:
            self._create_tables()
        elif schemas_dir and version < self.SCHEMA_VERSION:
            self._migrate_schema(version, to_version=self.SCHEMA_VERSION)
Beispiel #2
0
def migrate_schema(database: 'Database',
                   from_version: int,
                   to_version: int,
                   migrate_dir: str = default_migrate_dir()):

    if from_version == to_version:
        return

    router = Router(database.db, migrate_dir, schema_version=to_version)
    environment = router.environment

    scripts = environment.scripts
    to_run, to_fake, downgrade = choose_scripts(scripts, from_version,
                                                to_version)
    if not to_run:
        raise NoMigrationScripts(
            "Cannot migrate schema from version {} to {}: "
            "no suitable migration scripts found".format(
                from_version, to_version))

    with patch_peewee(database.fields, database.models):
        migrator = Migrator(router.database)

        # Teach migrator previous changes
        for script in to_fake:
            router.run_one(script, migrator, fake=True)

        for script in to_run:
            router.run_one(script, migrator, fake=False, downgrade=downgrade)

            version = environment.version_from_name(script)
            version -= 1 if downgrade else 0
            database.set_user_version(version)
Beispiel #3
0
 def database_context(self):
     from golem.model import db
     version = Database.SCHEMA_VERSION
     database = Database(db,
                         fields=DB_FIELDS,
                         models=DB_MODELS,
                         db_dir=self.tempdir,
                         schemas_dir=None)
     database.schemas_dir = default_migrate_dir()
     yield database
     Database.SCHEMA_VERSION = version
     database.close()
Beispiel #4
0
def create_migration(data_dir: str = get_local_datadir('default'),
                     migrate_dir: str = default_migrate_dir(),
                     migration_name: str = 'schema',
                     db_class: Type[Database] = Database,
                     force: bool = False):
    """ Create a schema migration script """
    from peewee_migrate.router import MIGRATE_TEMPLATE

    environment = Router.Environment(migrate_dir)
    database = db_class(db,
                        fields=DB_FIELDS,
                        models=DB_MODELS,
                        db_dir=data_dir,
                        schemas_dir=None)
    template = TEMPLATE.format(schema_version=database.SCHEMA_VERSION,
                               model_package=golem.model.__name__,
                               template=MIGRATE_TEMPLATE)

    if database.SCHEMA_VERSION <= (environment.last_version or 0):
        if force:
            script_path = os.path.join(migrate_dir, environment.last_script)
            os.unlink(script_path)
        else:
            print('Migration scripts are up-to-date')
            return None

    print('> database:   {}'.format(database.db.database))
    print('> output dir: {}'.format(migrate_dir))

    try:
        with patch_peewee(database.fields, database.models):
            r = Router(database.db, migrate_dir, database.SCHEMA_VERSION,
                       template)
            name = r.create(migration_name, auto=golem.model)
    finally:
        database.close()
        if os.path.exists('peewee.db'):
            os.unlink('peewee.db')

    partial_path = os.path.join(migrate_dir, name)
    return '{}.py'.format(partial_path)
Beispiel #5
0
def latest_migration_exists(migrate_dir=default_migrate_dir()):
    environment = Router.Environment(migrate_dir)
    return environment.last_version == Database.SCHEMA_VERSION
Beispiel #6
0
 def __init__(self, migrate_dir: str = default_migrate_dir()):
     self._router = Router.__new__(Router)
     self._router.logger = logger
     self._router.migrate_dir = migrate_dir
     self._router.schema_version = None
     self._router.template = None