Flask-Migrate — миграции базы данных

В этой главе вы узнаете, как безопасно управлять изменениями схемы базы данных с помощью Flask-Migrate, и поймёте, как это соответствует миграциям Django.


Почему нельзя всегда использовать db.create_all()?

db.create_all()Есть два фатальных недостатка:

  • Создает таблицу только если она не существует. Изменение модели (например, добавление новых полей) не обновит существующие таблицы.
  • История изменений не сохраняется. Вы не можете откатиться к предыдущему состоянию базы данных.

Миграции базы данныхПрямо как Git для баз данных — каждое изменение схемы создает файл версии, поддерживая обновления и откаты.

Flask-MigrateЭто расширение Flask для Alembic, созданное специально для SQLAlchemy.


Установка и настройка

(venv) $ pip install flask-migrate

Пример

# Путь к файлу: app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'

db = SQLAlchemy(app)
migrate = Migrate(app, db)    # Привяжите app и db к Migrate

Миграция в три шага

ШагиКомандаФункцияЭквивалент в Django
Инициализацияflask db initСоздайте каталог migrations/ (выполняется только один раз).—
Сгенерироватьflask db migrate -m "description"Обнаруживает изменения модели и генерирует скрипты миграции.makemigrations
Executeflask db upgradeПрименяет скрипты миграции к базе данных.migrate

Шаг 1: Инициализация каталога миграций

(venv) $ flask db init
Creating directory migrations/...  done

Создается после выполненияmigrations/Каталог (аналогично каталогу .git в Git), нужно выполнить только один раз.

Шаг 2: Сгенерируйте файлы миграций.

(venv) $ flask db migrate -m "初始化 Post 和 Category 模型"
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
Generating migrations/versions/xxxx_initial.py ... done

Если у вас еще нет изменений в модели, просто выполните эту команду на существующей модели.

Шаг 3: Выполните миграции.

(venv) $ flask db upgrade
INFO  [alembic.runtime.migration] Running upgrade  -> xxxx, 初始化

Практика: добавьте новое поле в модель Post.

Предположим, требования к продукту изменились, и вам нужно добавить счетчик прочтений к статье.

Пример

# Путь к файлу: добавлено в класс Post в models.py
class Post(db.Model):
    # ... существующие поля
    read_count = db.Column(db.Integer, default=0)  # Новое: количество прочтений

После изменения модели выполните миграции:

(venv) $ flask db migrate -m "Post 模型新增 read_count 字段"
(venv) $ flask db upgrade

Теперь в базе данныхpostsТаблица была автоматически добавленаread_countСтолбцы, существующие данные не затронуты.

Просмотрите историю миграций

Проверьте, на какой версии находится текущая база данных:

(venv) $ flask db current

Просмотреть всю историю миграций:

(venv) $ flask db history

Откат миграции

Миграции можно откатить:

(venv) $ flask db downgrade   # 回退到上一个版本

Это удалитread_countСтолбец, отменить все изменения из последней миграции.

Не все операции можно откатить автоматически (например, удаление столбца в SQLite). Подтвердите перед откатом.flask db currentПроверьте текущую версию, чтобы убедиться, что вы знаете, что откатываете. Всегда создавайте резервную копию данных перед откатом в рабочей среде.


Сравнение Flask-Migrate и миграций Django

ДействиеFlask(Flask-Migrate)Django
Инициализацияflask db initНе требуется (проект поставляется с каталогом migrations).
Сгенерировать миграциюflask db migrate -m "description"python manage.py makemigrations
Выполнить миграциюflask db upgradepython manage.py migrate
Откатflask db downgradepython manage.py migrate app 0001
Просмотреть историюflask db historypython manage.py showmigrations
Степень автоматизацииТребуется инициализация; она обнаруживает зависимость от Alembic.Полностью автоматически, дополнительная настройка не требуется.

Система миграций Django более автоматизирована и более интегрирована; Flask достигает такого же уровня возможностей с помощью Flask-Migrate.


Итоги главы

В этой главе вы освоили полный рабочий процесс Flask-Migrate: flask db init инициализирует, flask db migrate генерирует скрипты миграции, flask db upgrade применяет миграции, а flask db downgrade выполняет откат.

С этого момента каждый раз, когда вы изменяете models.py, следуйте этому трёхшаговому рабочему процессу, и изменения схемы базы данных всегда будут иметь отслеживаемую историю.

Другие расширения