Using Flask-Alembic¶
Initialize the Application¶
First, set up your Flask application (or application factory) and the Flask-SQLAlchemy extension and models.
This extension follows the common pattern of Flask extension setup. Either immediately
pass an app to Alembic
, or call init_app()
later.
from flask_alembic import Alembic
alembic = Alembic()
alembic.init_app(app) # call in the app factory if you're using that pattern
When an app is registered, the migrations directory is created if it does not exist.
Using Alembic from the Command Line¶
Flask-Alembic automatically adds a db
group of commands to the flask
CLI. From
there you can generate revisions, apply upgrades, etc. The basic commands are
revision
to create a new revision, and upgrade
to apply available revisions.
$ flask db --help
$ flask db revision "made changes"
$ flask db upgrade
Using Alembic from Python¶
The alembic
instance provides an interface between the current app and Alembic. It
exposes similar commands to the command line available from Alembic, but Flask-Alembic’s
methods return data rather than produce output. You can use this interface to do what
the command line commands do, from inside your app.
# generate a new revision
# same as `flask db revision "made changes"`
alembic.revision("made changes")
# run all available upgrades
# same as `flask db upgrade`
alembic.upgrade()
You can also get at the Alembic internals that enable these commands. See the Alembic API docs for more information.
# locate a revision by name
alembic.script.get_revision("head")
# could compare this to the "head" revision above to see if upgrades are needed
alembic.context.get_current_revision()
# probably don't want to do this outside a revision, but it'll work
alembic.op.drop_column("my_table", "my_column")
# see that the column you just dropped will be added back next revision
alembic.compare_metadata()
The functions require an app context. If you’re calling them outside a view, set up a context manually.
with app.app_context():
alembic.upgrade()