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)
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)
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()
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)
def latest_migration_exists(migrate_dir=default_migrate_dir()): environment = Router.Environment(migrate_dir) return environment.last_version == Database.SCHEMA_VERSION
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