예제 #1
0
파일: command.py 프로젝트: Lifto/alembic
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)
예제 #2
0
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)
예제 #3
0
    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)
예제 #4
0
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)
예제 #5
0
    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())
예제 #6
0
    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())