Database Migration Management with Flask-Migrate

Flask-Migrate is an extension that integrates Alembic into Flask applications, enabling tracking of model changes and mapping them to the database.

Install Flask-Migrate via pip:

pip install flask-migrate

A typical project structure includes:

  • config.py
  • app.py
  • manager.py
  • models.py

Define database configuration in config.py:

class Config:
    ENV = 'development'
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:password@host:port/db_name'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ECHO = True

Set up the Flask application in app.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Config

db = SQLAlchemy()
app = Flask(__name__)
app.config.from_object(Config)
db.init_app(app)

@app.route('/')
def home():
    return 'Welcome'

if __name__ == '__main__':
    app.run()

Define a model in models.py:

from app import db

class Account(db.Model):
    __tablename__ = 'account'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(60), nullable=False)
    secret = db.Column(db.String(30), nullable=False)

    def __repr__(self):
        return f'<Account {self.name}>'

Create a migration manager in manager.py:

from app import app, db
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager

migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

Execute migration commands:

  1. Initialize migration environment:
python manager.py db init
  1. Generate migration script after model changes:
python manager.py db migrate
  1. Apply migrations to the database:
python manager.py db upgrade

When updating the model, modify models.py and run migrate and upgrade commands. For example, add a new column:

class Account(db.Model):
    __tablename__ = 'account'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True)
    secret = db.Column(db.String(30), nullable=False)
    extra = db.Column(db.String(50), nullable=False)  # New column

    def __repr__(self):
        return f'<Account {self.name}>'

Run:

python manager.py db migrate
python manager.py db upgrade

To resolve import errors like cannot import name 'soft_unicode' from 'markupsafe', update the AWS SAM CLI:

pip install --user --upgrade aws-sam-cli

Tags: Flask database migration Flask-Migrate SQLAlchemy python

Posted on Fri, 02 Oct 2026 16:05:46 +0000 by TWD