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