2019-09-11 10:17:14 +03:00
|
|
|
How Hasura migrations work
|
|
|
|
==========================
|
2019-03-28 13:51:58 +03:00
|
|
|
|
|
|
|
.. contents:: Table of contents
|
|
|
|
:backlinks: none
|
|
|
|
:depth: 1
|
|
|
|
:local:
|
|
|
|
|
2019-09-11 10:17:14 +03:00
|
|
|
This is an explanation on how the Hasura migration system works. To understand how
|
2019-03-28 13:51:58 +03:00
|
|
|
to use the system, refer to :doc:`Migrations & Metadata <../index>`.
|
|
|
|
|
|
|
|
Metadata
|
|
|
|
--------
|
|
|
|
|
|
|
|
Let's first talk about metadata. Whenever you do certain actions on the console
|
2019-10-17 15:02:01 +03:00
|
|
|
or via the API, Hasura records it in the :doc:`metadata catalogue <../../how-it-works/metadata-schema>`
|
|
|
|
which is a schema called ``hdb_catalog`` in your Postgres database. For example, if you track
|
|
|
|
a table, a new entry is created in the ``hdb_catalog.hdb_table`` table in Postgres.
|
|
|
|
Similarly, there are more tables in this schema to track relationships, event triggers,
|
|
|
|
functions and remote schemas.
|
2019-03-28 13:51:58 +03:00
|
|
|
|
|
|
|
All information in this schema can be exported as a single JSON file. Export
|
|
|
|
options are available on the console, CLI and via the API. This file when
|
2019-09-11 10:17:14 +03:00
|
|
|
imported to an existing or new Hasura instance, will clear out the
|
2019-03-28 13:51:58 +03:00
|
|
|
``hdb_catalog`` schema on that instance and populates it again with the imported
|
|
|
|
data. One thing to note is that all the Postgres resources the metadata refers
|
|
|
|
to should already exist when the import happens, otherwise Hasura will throw an
|
|
|
|
error.
|
|
|
|
|
|
|
|
To understand the format of the ``metadata.json`` file, refer to :ref:`metadata_file_format`.
|
|
|
|
|
|
|
|
For more details on how to import and export metadata, refer to :ref:`manage_hasura_metadata`.
|
|
|
|
|
|
|
|
Migrations
|
|
|
|
----------
|
|
|
|
|
|
|
|
While metadata can be exported as a single file as a representation of the state
|
2019-09-11 10:17:14 +03:00
|
|
|
of Hasura, you might want more granular step-by-step checkpoints on the
|
2019-03-28 13:51:58 +03:00
|
|
|
evolution of the state. You might also want to track the Postgres schema changes
|
|
|
|
through Hasura's migration system.
|
|
|
|
|
|
|
|
Migrations are stored and applied as steps (or versions). A migration step (or
|
|
|
|
version) may contain changes to the Postgres schema and Hasura metadata. The
|
|
|
|
migration version can also store the ``up`` migration (creating resources) and
|
|
|
|
the ``down`` migration (deleting resources). For example, migration version
|
|
|
|
``1`` can include the SQL statements required to create a table called
|
|
|
|
``profile`` along with the Hasura metadata action to track this table as the
|
2019-09-11 10:17:14 +03:00
|
|
|
``up`` migration and SQL statements to drop this table along with the metadata
|
2019-03-28 13:51:58 +03:00
|
|
|
action to untrack the table as the ``down`` migration.
|
|
|
|
|
2019-09-11 10:17:14 +03:00
|
|
|
The migration versions can be automatically generated by the Hasura console or
|
|
|
|
can be written by hand. They are stored as YAML files in a directory
|
2019-03-28 13:51:58 +03:00
|
|
|
called ``migrations``.
|
|
|
|
|
|
|
|
For more details on the format of these files, refer to
|
|
|
|
:ref:`migration_file_format`.
|
|
|
|
|
2019-09-11 10:17:14 +03:00
|
|
|
When someone executes ``migrate apply`` using the Hasura CLI, the CLI will first
|
2019-03-28 13:51:58 +03:00
|
|
|
read the migration files present in the designated directory. The CLI would then
|
2019-09-11 10:17:14 +03:00
|
|
|
contact the Hasura Server and get the status of all migrations applied to the
|
|
|
|
server by reading the ``hdb_catalog.schema_migrations`` table. Each row in this
|
2019-03-28 13:51:58 +03:00
|
|
|
table denotes a migration version that is already applied on the server.
|
|
|
|
|
|
|
|
By comparing these two sets of versions, the CLI derives which versions are
|
2019-09-11 10:17:14 +03:00
|
|
|
already applied and which are not. The CLI would then go ahead and apply the
|
2019-03-28 13:51:58 +03:00
|
|
|
migrations on the server. This is done by executing the actions against the
|
2019-09-11 10:17:14 +03:00
|
|
|
database through the Hasura metadata APIs. Whenever the ``apply`` command is
|
2019-03-28 13:51:58 +03:00
|
|
|
used, all migrations that are to be applied are executed in a Postgres
|
2019-09-11 10:17:14 +03:00
|
|
|
transaction (through a ``bulk`` API call). The advantage of doing this is that if
|
2019-03-28 13:51:58 +03:00
|
|
|
there are any errors, all actions are rolled back and the user can properly
|
|
|
|
debug the error without worrying about partial changes.
|
|
|
|
|
2019-09-11 10:17:14 +03:00
|
|
|
The default action of the ``migrate apply`` command is to execute all the ``up``
|
2019-03-28 13:51:58 +03:00
|
|
|
migrations. In order to roll back changes, you would need to execute ``down``
|
2019-09-11 10:17:14 +03:00
|
|
|
migrations using the ``--down`` flag on the CLI.
|
2019-03-28 13:51:58 +03:00
|
|
|
|
2019-09-11 10:17:14 +03:00
|
|
|
This guide provides an overall idea of how the system works. For more details
|
2019-03-28 13:51:58 +03:00
|
|
|
on how to actually use the system, refer to :ref:`postgres_schema_metadata`.
|