Altering the database

Alter the model code

First alter the model code. Simply edit models.py and modify all required model classes. Make sure that your changes reflect on related classes as the migration should be consistent from one structure to another.

Do not commit your changes at that stage.

Generate the migration script

After you modify the database models, you need to generate a new schema migration script:

python manage.py db migrate

This will generate a new script in migrations/versions that you must review before adding it for commit.

Because we use SQLite, make sure that you use batch operation for column changes and deletion. For instance:

def downgrade():
    with op.batch_alter_table('fetch') as batch:
        batch.drop_column('last_check')
        batch.drop_column('error')

or

def upgrade():
    # spam_threshold is a X/15 based value, we're converting it to percent.
    for user in User.query.all():
         user.spam_threshold = int(100. * float(user.spam_threshold or 0.) / 15.)
    db.session.commit()

    # set default to 80%
    with op.batch_alter_table('user') as batch:
        batch.alter_column('spam_threshold', default=80.)

Remove unneeded Alembic comments and add a proper description to your migration script.

Upgrade your local database

At that point, to start working on the changed database structure, you will need to upgrade your local database. Make a backup of your database, then:

python manage.py db upgrade

If any error arises, restore the backup, fix the migration script and try again.

Actually work on your feature or fix

If your changes to the database are related to a view or template, you may not work on these to reflect the changes and access the proper columns/tables.

Commit your work

You may finally commit your work as a whole: database changes and view/template changes. Do not forget to add the migration script.