Flask-Migrate — Migración de bases de datos

En este capítulo aprenderás a usar Flask-Migrate para gestionar de forma segura los cambios en la estructura de la base de datos y a comprender su correspondencia con Django migration.


¿Por qué no se puede usar siempre db.create_all()?

db.create_all()Tiene dos defectos fatales:

  • Solo crea cuando la tabla no existe. Si modificas el modelo (por ejemplo, agregando campos), las tablas existentes no se actualizan.
  • No conserva el historial de cambios. No se puede revertir a un estado anterior de la base de datos.

Migración de bases de datosEs como Git para bases de datos: cada cambio de estructura genera un archivo de versión, con soporte para actualizar y revertir.

Flask-MigrateEs la extensión de Flask para Alembic, diseñada específicamente para SQLAlchemy.


Instalación y configuración

(venv) $ pip install flask-migrate

Ejemplo

# Ruta del archivo: 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)    # Vincular app y db a Migrate

El proceso de migración en tres pasos

PasoComandoFunciónEquivalente en Django
Inicializaciónflask db initCrear el directorio migrations/ (solo se ejecuta una vez)—
Generaciónflask db migrate -m "descripción"Detecta cambios en los modelos y genera el script de migración.makemigrations
Ejecuciónflask db upgradeAplica el script de migración a la base de datos.migrate

Paso 1: Inicializar el directorio de migración

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

Después de ejecutarlo se generamigrations/el directorio (similar al directorio .git de Git), solo se ejecuta una vez.

Paso 2: Generar el archivo de migración

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

Si aún no tienes ningún cambio en los modelos, simplemente ejecuta este comando sobre los modelos existentes.

Paso 3: Ejecutar la migración

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

Práctica: Agregar un campo al modelo Post

Supongamos que los requisitos del producto cambian y necesitas agregar un contador de lecturas al artículo.

Ejemplo

# Ruta del archivo: agregar en la clase Post de models.py
class Post(db.Model):
    # ... campos existentes ...
    read_count = db.Column(db.Integer, default=0)  # Nuevo: contador de lecturas

Después de modificar el modelo, ejecuta la migración:

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

Ahora en la base de datos,postsla tabla automáticamente ha agregadoread_countla columna; los datos existentes no se ven afectados.

Ver el historial de migraciones

Ver en qué versión se encuentra la base de datos actual:

(venv) $ flask db current

Ver todo el historial de migraciones:

(venv) $ flask db history

Revertir la migración

Las migraciones se pueden deshacer:

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

Esto eliminaráread_countla columna, deshaciendo todos los cambios de la última migración.

No todas las operaciones se pueden revertir automáticamente (por ejemplo, eliminar columnas en SQLite). Antes de revertir, confirmaflask db currentla versión actual y asegúrate de saber qué estás revirtiendo. Antes de revertir en producción, asegúrate de respaldar los datos.


Comparación entre Flask-Migrate y Django Migration

OperaciónFlask(Flask-Migrate)Django
Inicializaciónflask db initNo es necesario (el proyecto incluye el directorio migrations)
Generar migraciónflask db migrate -m "descripción"python manage.py makemigrations
Ejecutar migraciónflask db upgradepython manage.py migrate
Revertirflask db downgradepython manage.py migrate app 0001
Ver historialflask db historypython manage.py showmigrations
Grado de automatizaciónRequiere inicialización; la detección depende de AlembicTotalmente automático, sin configuración adicional

El sistema de migraciones de Django es más automatizado e integrado; Flask alcanza un nivel similar mediante Flask-Migrate.


Resumen del capítulo

En este capítulo has dominado el flujo completo de Flask-Migrate: flask db init para inicializar, flask db migrate para generar el script de migración, flask db upgrade para ejecutar la migración y flask db downgrade para revertir.

De ahora en adelante, cada vez que modifiques models.py sigue este proceso de tres pasos; los cambios en la estructura de la base de datos siempre tendrán un historial rastreable.

Otras extensiones