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
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
| Paso | Comando | Función | Equivalente en Django |
|---|---|---|---|
| Inicialización | flask db init | Crear el directorio migrations/ (solo se ejecuta una vez) | — |
| Generación | flask db migrate -m "descripción" | Detecta cambios en los modelos y genera el script de migración. | makemigrations |
| Ejecución | flask db upgrade | Aplica 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
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, confirma
flask 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ón | Flask(Flask-Migrate) | Django |
|---|---|---|
| Inicialización | flask db init | No es necesario (el proyecto incluye el directorio migrations) |
| Generar migración | flask db migrate -m "descripción" | python manage.py makemigrations |
| Ejecutar migración | flask db upgrade | python manage.py migrate |
| Revertir | flask db downgrade | python manage.py migrate app 0001 |
| Ver historial | flask db history | python manage.py showmigrations |
| Grado de automatización | Requiere inicialización; la detección depende de Alembic | Totalmente 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