def revision(config, message=None, autogenerate=False, sql=False): """Create a new revision file.""" script = ScriptDirectory.from_config(config) template_args = {} imports = set() environment = util.asbool( config.get_main_option("revision_environment") ) if autogenerate: environment = True util.requires_07("autogenerate") def retrieve_migrations(rev, context): if script.get_revision(rev) is not script.get_revision("head"): raise util.CommandError("Target database is not up to date.") autogen._produce_migration_diffs(context, template_args, imports) return [] elif environment: def retrieve_migrations(rev, context): return [] if environment: with EnvironmentContext( config, script, fn=retrieve_migrations, as_sql=sql, template_args=template_args, ): script.run_env() script.generate_revision(util.rev_id(), message, **template_args)
def history(self, rev_range="base:heads", indicate_current=False): """List changeset scripts in chronological order. :param rev_range: string revision range :param indicate_current: indicate current revision. ..versionadded:: 0.9.9 """ if rev_range is not None: if ":" not in rev_range: raise util.CommandError( "History range requires [start]:[end], " "[start]:, or :[end]" ) base, head = rev_range.strip().split(":") else: base = head = None environment = ( util.asbool(self.config.get_main_option("revision_environment")) or indicate_current ) def _display_history(base, head, currents=()): history = list() for sc in self.script_directory.walk_revisions( base=base or "base", head=head or "heads" ): if indicate_current: sc._db_current_indicator = sc in currents history.insert(0, sc) return history def _display_history_w_current(base, head): def _display_current_history(rev): if head == "current": return _display_history(base, rev, rev) elif base == "current": return _display_history(rev, head, rev) else: return _display_history(base, head, rev) return [] rev = self.current return _display_current_history(rev) if base == "current" or head == "current" or environment: return _display_history_w_current(base, head) else: return _display_history(base, head)
def revision_command(extension_module_name, message=None, autogenerate=False, sql=False, **kwargs): """Create a new revision file.""" pkg_env = ExtensionPackageEnv(extension_module_name) config = pkg_env.config # The rest of this method is a direct copy of alembic.command:revision, # except for replacing ``with EnvironmentContext...`` with # ``pkg_env.run_env...`` script = ScriptDirectory.from_config(config) template_args = { 'config': config # Let templates use config for # e.g. multiple databases } imports = set() environment = util.asbool( config.get_main_option("revision_environment") ) if autogenerate: environment = True def retrieve_migrations(rev, context): if script.get_revision(rev) is not script.get_revision("head"): raise util.CommandError("Target database is not up to date.") autogen._produce_migration_diffs(context, template_args, imports) return [] elif environment: def retrieve_migrations(rev, context): return [] if environment: pkg_env.run_env( fn=retrieve_migrations, as_sql=sql, template_args=template_args, ) script.generate_revision(util.rev_id(), message, **template_args)
def revision(self, message, empty=False, branch='default', parent='head', splice=False, depend=None, label=None, path=None): """Create a new revision. By default, auto-generate operations by comparing models and database. :param message: description of revision :param empty: don't auto-generate operations :param branch: use this independent branch name :param parent: parent revision(s) of this revision :param splice: allow non-head parent revision :param depend: revision(s) this revision depends on :param label: label(s) to apply to this revision :param path: where to store this revision :return: list of new revisions """ if parent is None: parent = ['head'] elif isinstance(parent, string_types): parent = [parent] else: parent = [getattr(r, 'revision', r) for r in parent] if label is None: label = [] elif isinstance(label, string_types): label = [label] else: label = list(label) # manage independent branches if branch: for i, item in enumerate(parent): if item in ('base', 'head'): parent[i] = '{}@{}'.format(branch, item) if not path: branch_path = dict( item for item in current_app.config['ALEMBIC'] ['version_locations'] if not isinstance(item, string_types)).get(branch) if branch_path: path = branch_path try: branch_exists = any( r for r in self.script_directory.revision_map.get_revisions( branch) if r is not None) except ResolutionError: branch_exists = False if not branch_exists: # label the first revision of a separate branch and start it from base label.insert(0, branch) parent = ['base'] if not path: path = self.script_directory.dir # relative path is relative to app root if path and not os.path.isabs(path) and ':' not in path: path = os.path.join(current_app.root_path, path) revision_context = autogenerate.RevisionContext( self.config, self.script_directory, { 'message': message, 'sql': False, 'head': parent, 'splice': splice, 'branch_label': label, 'version_path': path, 'rev_id': self.rev_id(), 'depends_on': depend }) def do_revision(revision, context): if empty: revision_context.run_no_autogenerate(revision, context) else: revision_context.run_autogenerate(revision, context) return [] if not empty or util.asbool( self.config.get_main_option('revision_environment')): self.run_migrations(do_revision) return list(revision_context.generate_scripts())
def revision( self, message, empty=False, branch="default", parent="head", splice=False, depend=None, label=None, path=None, ): """Create a new revision. By default, auto-generate operations by comparing models and database. :param message: Description of revision. :param empty: Don't auto-generate operations. :param branch: Use this independent branch name. :param parent: Parent revision(s) of this revision. :param splice: Allow non-head parent revision. :param depend: Revision(s) this revision depends on. :param label: Label(s) to apply to this revision. :param path: Where to store this revision. :return: List of new revisions. """ if parent is None: parent = ["head"] elif isinstance(parent, string_types): parent = [parent] else: parent = [getattr(r, "revision", r) for r in parent] if label is None: label = [] elif isinstance(label, string_types): label = [label] else: label = list(label) # manage independent branches if branch: for i, item in enumerate(parent): if item in ("base", "head"): parent[i] = "{}@{}".format(branch, item) if not path: branch_path = dict( item for item in current_app.config["ALEMBIC"] ["version_locations"] if not isinstance(item, string_types)).get(branch) if branch_path: path = branch_path try: branch_exists = any( r for r in self.script_directory.revision_map.get_revisions( branch) if r is not None) except ResolutionError: branch_exists = False if not branch_exists: # label the first revision of a separate branch and start it from base label.insert(0, branch) parent = ["base"] if not path: path = self.script_directory.dir # relative path is relative to app root if path and not os.path.isabs(path) and ":" not in path: path = os.path.join(current_app.root_path, path) revision_context = autogenerate.RevisionContext( self.config, self.script_directory, { "message": message, "sql": False, "head": parent, "splice": splice, "branch_label": label, "version_path": path, "rev_id": self.rev_id(), "depends_on": depend, }, ) def do_revision(revision, context): if empty: revision_context.run_no_autogenerate(revision, context) else: revision_context.run_autogenerate(revision, context) return [] if not empty or util.asbool( self.config.get_main_option("revision_environment")): self.run_migrations(do_revision) return list(revision_context.generate_scripts())