managestate
===========

:synopsis: Saves current applied migrations to a file or applies migrations from this file.

The `managestate` command fetches last applied migrations from a specified database
and saves them to a specified file. After that, you may easily apply saved migrations.
The advantage of this approach is that you may have at hand several database states
and quickly switch between them.

Why?
----

While you develop several features or fix some bugs at the same time you often meet
the situation when you need to apply or unapply database migrations before you check out
to another feature/bug branch. You always need to view current migrations by `showmigrations`,
then apply or unapply it manually using `migrate` and there is no problem if you work with
one Django app. But when there is more than one, it starts to annoy. To forget about the problem
and quickly switch between branches use the `managestate` command.

How?
----

To dump current migrations use::

    $ ./manage.py managestate dump

A state will be saved to `managestate.json` just about the following::

    {
      "default": {
        "admin": "0003_logentry_add_action_flag_choices",
        "auth": "0012_alter_user_first_name_max_length",
        "contenttypes": "0002_remove_content_type_name",
        "sessions": "0001_initial",
        "sites": "0002_alter_domain_unique",
        "myapp": "zero"
      },
      "updated_at": "2021-06-27 10:42:50.364070"
    }

As you see, migrations have been saved as the state called "default".
You can specify it using the positional argument::

    $ ./manage.py managestate dump my_feature_branch

Then migrations will be added to `managestate.json` under the key "my_feature_branch".
To change the filename use `-f` or `--filename` flag.

When you load a state from a file, you may also use all arguments defined for the `migrate` command.

Examples
--------

Save an initial database state of the branch "master/main" before developing features::

    $ ./manage.py managestate dump master

Check out to your branch, develop your feature, and dump its state when you are going to get reviewed::

    $ ./manage.py managestate dump super-feature

Check out to the "master" branch back and rollback a database state with just one command::

    $ ./manage.py managestate load master

If you need to add some improvements to your feature, just use::

    $ ./manage.py managestate load super-feature
