Custom data

To preempt the need to write an explicit test for every new migration, there is a mechanism built into the config to automatically insert data into the database before or upon reaching a given revision.

To that end:

@pytest.fixture
def alembic_config():
    return {
        "before_revision_data": {
            "fb4d3ab5f38d": [
                {"__tablename__": "foo", "id": 1, "name": "foo"},
                {"__tablename__": "bar", "id": 1, "name": "bar"},
            ],
        },
        "at_revision_data": {
            "a5a9ccc4e535": {
                "__tablename__": "foo",
                "id": 1,
                "name": "foo2",
            },
        },
    }

There are two, similiar but distinct options. before_revision_data, and at_revision_data.

  • before_revision_data will insert the given data for all upgrade commands before performing the upgrade to the given revision.

  • at_revision_data will insert the given data for all upgrade commands after having performed the upgrade to the given revision.

To be clear, you can use either of them to describe the same operation. But depending on the circumstance (if for example, you are testing a real-world situation that you are trying to semantically model more closely), one or the other option may be more appropriate.

Schema

The value for either before_revision_data or at_revision_data, should be a dict() where the keys are the revision for which the data is being described.

The value can either be a dict() (single row), or a list() of dict() (multiple rows). __tablename__ is a special key which tells us the name of the table to insert the data into, and the rest of the spec should describe the columns and the column data for that row, similar to what you might do for a table.insert().values(...) call.

Alternatively, you can directly import and instantiate a RevisionSpec and set that as the value to either before_revision_data or at_revision_data.

Example

Given the above data, and history of:

23256c7bf855 > fb4d3ab5f38d -> a5a9ccc4e535 -> b835ae9ff1d1

We would:

  • Upgrade to 23256c7bf855

  • Insert {"__tablename__": "foo", "id": 1, "name": "foo"} and {"__tablename__": "bar", "id": 1, "name": "bar"}

  • Upgrade to fb4d3ab5f38d

  • Upgrade to a5a9ccc4e535

  • Insert {"__tablename__": "foo", "id": 1, "name": "foo2"}

  • Upgrade to b835ae9ff1d1