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:
- Initialize migration environment:
python manager.py db init
- Generate migration script after model changes:
python manager.py db migrate
- 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