Flask-Migrate — миграции базы данных
В этой главе вы узнаете, как безопасно управлять изменениями схемы базы данных с помощью Flask-Migrate, и поймёте, как это соответствует миграциям Django.
Почему нельзя всегда использовать db.create_all()?
db.create_all()Есть два фатальных недостатка:
- Создает таблицу только если она не существует. Изменение модели (например, добавление новых полей) не обновит существующие таблицы.
- История изменений не сохраняется. Вы не можете откатиться к предыдущему состоянию базы данных.
Миграции базы данныхПрямо как Git для баз данных — каждое изменение схемы создает файл версии, поддерживая обновления и откаты.
Flask-MigrateЭто расширение Flask для Alembic, созданное специально для SQLAlchemy.
Установка и настройка
(venv) $ pip install flask-migrate
Пример
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 |
| Execute | flask 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.
Предположим, требования к продукту изменились, и вам нужно добавить счетчик прочтений к статье.
Пример
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 upgrade | python manage.py migrate |
| Откат | flask db downgrade | python manage.py migrate app 0001 |
| Просмотреть историю | flask db history | python manage.py showmigrations |
| Степень автоматизации | Требуется инициализация; она обнаруживает зависимость от Alembic. | Полностью автоматически, дополнительная настройка не требуется. |
Система миграций Django более автоматизирована и более интегрирована; Flask достигает такого же уровня возможностей с помощью Flask-Migrate.
Итоги главы
В этой главе вы освоили полный рабочий процесс Flask-Migrate: flask db init инициализирует, flask db migrate генерирует скрипты миграции, flask db upgrade применяет миграции, а flask db downgrade выполняет откат.
С этого момента каждый раз, когда вы изменяете models.py, следуйте этому трёхшаговому рабочему процессу, и изменения схемы базы данных всегда будут иметь отслеживаемую историю.
Другие расширения