Modifying the DatabaseΒΆ

Sometimes new features require modifying the database, such as adding a new column. Implementing such changes is fine, but can cause compatibility problems for users who are using an older version of the database schema. To resolve this issue, we use alembic to handle database migrations.

To use alembic to migrate the database schema, first run the following command:

python -m nbgrader.dbutil revision -m "a description of the change"

This will create a file in the directory nbgrader/alembic/versions, for example nbgrader/alembic/versions/7685cbef311a_foo.py. You will now need to edit the upgrade() and downgrade() functions in this file such that they appropriately make the database changes. For example, to add a column called extra_credit to the grade table:

def upgrade():
    op.add_column('grade', sa.Column('extra_credit', sa.Float))

def downgrade():
    op.drop_column('grade', 'extra_credit')

Please see the alembic documentation for further details on how these files work. Additionally, note that you both need to update the database schema in nbgrader/api.py (this describes how to create new databases) as well as using alembic to describe what changes need to be made to old databases.

You can test whether the database migration works appropriately by running:

nbgrader db upgrade

on an old version of the database.