Python Flask – Migraciones a bases de datos con Flask-Migrate

Este es un ejemplo completo de cómo configurar Flask-Migrate con una base de datos PostgreSQL en una aplicación Flask. Esto servirá para automatizar la creación de tablas, campos y registros a partir de los los modelos configurados en nuestro código python.

Creación de la base de datos:

Primero, asegúrate de tener PostgreSQL instalado y configurado en tu sistema antes de continuar.

$ pip install psycopg2

Crearemos un entorno virtual dentro del proyecto:

$ pip install virtualenv
$ virtualenv developer-venv

Activar el entorno virtual:

$ developer-venv\Scripts\activate

Instalaremos Flask y extensiones:

$ pip install Flask Flask-SQLAlchemy Flask-Migrate psycopg2-binary

Crea un archivo Python para tu aplicación Flask y el modelo a usar, por ejemplo, app.py, y agrega el siguiente código:

app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://usuario:clave@localhost/basededatos'

db = SQLAlchemy(app)
migrate = Migrate(app, db)

# Define el modelo de datos Usuario
class Usuario(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(80), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    edad = db.Column(db.Integer)

@app.route('/')
def index():
    # Crear un nuevo usuario con edad
    nuevo_usuario = Usuario(nombre='Jose', email='jose@beastieux.com')
    nuevo_usuario.edad = 26  # Agrega la edad
    db.session.add(nuevo_usuario)
    db.session.commit()

    # Consultar usuarios y sus edades
    usuarios = Usuario.query.all()
    resultados = [f'{usuario.nombre}, {usuario.email}, {usuario.edad}' for usuario in usuarios]
    return '<br>'.join(resultados)

if __name__ == '__main__':
    app.run()

Asegúrate de reemplazar tu_usuario, tu_contraseña, localhost y tu_basededatos con los valores adecuados para tu configuración de PostgreSQL.

Paso 5: Inicializar las Migraciones

Con el siguiente comendo prepararemos el entorno para iniciar la migración del modelo creado en python hacia la base de datos definida, en este caso a postgresql:

$ flask db init

Paso 6: Generar una Migración

$ flask db migrate -m "Crea la tabla Usuarios"

Paso 7: Aplicar la Migración

$ flask db upgrade

Paso 8: Ejecutar la aplicación Python para actualizar los registro del modelo:

$ python app.py

Paso 9: Abrir la aplicación ejecutada para que el proceso se ejecute:

http://localhost:5000

Ahora puedes interactuar con la base de datos PostgreSQL utilizando tu modelo de datos, de manera similar a como se mencionó en pasos anteriores.

La primera vez que lo ejecutes saldrá un mensaje con los datos creados, la segunda vez dará error porque está tratando de registrar los mismos datos y el campo email está configurado como UNIQUE, cambiar ese valor para hacer nuevas pruebas, para ello volver a repetir el paso 8.

Paso 10: Modificar modelo y actualizar base de datos:

En este paso probaremos modificando el modelo, en este caso agregaremos un campo nuevo (apellidos) al modelo:

class Usuario(db.Model):
...
    apellidos = db.Column(db.String(120))
...
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://usuario:clave@localhost/basededatos'

db = SQLAlchemy(app)
migrate = Migrate(app, db)

# Define el modelo de datos Usuario
class Usuario(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(80), nullable=False)
    apellidos = db.Column(db.String(120))
    email = db.Column(db.String(120), unique=True, nullable=False)
    edad = db.Column(db.Integer)

@app.route('/')
def index():
    # Crear un nuevo usuario con edad
    nuevo_usuario = Usuario(nombre='Juan', email='juan@example.com')
    nuevo_usuario.apellidos = 'Perez'  # Agrega apellido    
    nuevo_usuario.edad = 26  # Agrega la edad
    db.session.add(nuevo_usuario)
    db.session.commit()

    # Consultar usuarios y sus edades
    usuarios = Usuario.query.all()
    resultados = [f'{usuario.nombre}, {usuario.email}, {usuario.edad}' for usuario in usuarios]
    return '<br>'.join(resultados)

if __name__ == '__main__':
    app.run()

Una vez modificado, volver a ejecutar desde el paso 6:

$ flask db migrate -m "Agregar Apellidos al modelo"
$ flask db upgrade
$ python app.py
Abrir: http://localhost:5000

Deja un comentario