En este tema, aprenderemos cómo definir modelos en Flask utilizando Flask-SQLAlchemy. Los modelos son una representación de las tablas de la base de datos en forma de clases de Python. Cada clase representa una tabla y cada atributo de la clase representa una columna en la tabla.
Conceptos Clave
- Modelos: Clases que representan tablas en la base de datos.
- Columnas: Atributos de la clase que representan columnas en la tabla.
- Tipos de Datos: Especifican el tipo de datos que cada columna puede almacenar.
- Relaciones: Definen cómo los modelos se relacionan entre sí.
Configuración Inicial
Antes de definir modelos, asegúrate de tener Flask-SQLAlchemy instalado y configurado en tu proyecto. Si no lo has hecho, sigue estos pasos:
-
Instalación:
pip install flask-sqlalchemy -
Configuración:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db' db = SQLAlchemy(app)
Definiendo un Modelo Básico
Vamos a definir un modelo básico para una tabla User que tiene las columnas id, username, y email.
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f'<User {self.username}>'Explicación del Código
db.Model: Todas las clases de modelo deben heredar dedb.Model.db.Column: Define una columna en la tabla.db.Integer: Tipo de dato entero.primary_key=True: Define la columna como clave primaria.db.String(80): Tipo de dato cadena con un máximo de 80 caracteres.unique=True: Asegura que los valores en esta columna sean únicos.nullable=False: Asegura que la columna no pueda ser nula.
__repr__: Método especial que define cómo se representa el objeto cuando se imprime.
Tipos de Datos Comunes
| Tipo de Dato | Descripción |
|---|---|
db.Integer |
Entero |
db.String(size) |
Cadena de texto con longitud máxima size |
db.Text |
Cadena de texto sin longitud máxima |
db.Float |
Número de punto flotante |
db.Boolean |
Valor booleano (True o False) |
db.DateTime |
Fecha y hora |
db.Date |
Fecha |
db.Time |
Hora |
db.LargeBinary |
Datos binarios grandes |
Relaciones entre Modelos
Las relaciones permiten definir cómo los modelos se relacionan entre sí. Flask-SQLAlchemy soporta varios tipos de relaciones, como One-to-Many, Many-to-One, y Many-to-Many.
Ejemplo de Relación One-to-Many
Vamos a definir una relación One-to-Many entre User y Post. Un usuario puede tener múltiples publicaciones.
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(120), nullable=False)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
user = db.relationship('User', back_populates='posts')
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
posts = db.relationship('Post', back_populates='user')
def __repr__(self):
return f'<User {self.username}>'Explicación del Código
db.ForeignKey('user.id'): Define una clave foránea que referencia la columnaidde la tablauser.db.relationship('User', back_populates='posts'): Define la relación en el modeloPost.back_populates='posts': Define la relación inversa en el modeloUser.
Creación de la Base de Datos
Para crear las tablas en la base de datos, utiliza el siguiente comando:
Este comando crea todas las tablas definidas en los modelos.
Ejercicio Práctico
Ejercicio
Define un modelo Comment que tenga las siguientes columnas:
id: Entero, clave primaria.content: Texto, no nulo.post_id: Entero, clave foránea que referencia la columnaidde la tablaPost.
Solución
class Comment(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.Text, nullable=False)
post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False)
post = db.relationship('Post', back_populates='comments')
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(120), nullable=False)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
comments = db.relationship('Comment', back_populates='post')
user = db.relationship('User', back_populates='posts')
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
posts = db.relationship('Post', back_populates='user')
def __repr__(self):
return f'<User {self.username}>'Explicación
Comment: Define el modeloCommentcon una relaciónMany-to-OneconPost.post_id: Clave foránea que referencia la columnaidde la tablaPost.db.relationship('Post', back_populates='comments'): Define la relación en el modeloComment.comments = db.relationship('Comment', back_populates='post'): Define la relación inversa en el modeloPost.
Conclusión
En esta sección, hemos aprendido cómo definir modelos en Flask utilizando Flask-SQLAlchemy. Hemos cubierto los conceptos básicos de los modelos, tipos de datos comunes y cómo definir relaciones entre modelos. En la siguiente sección, exploraremos cómo realizar operaciones CRUD utilizando estos modelos.
¡Continúa practicando y experimentando con diferentes tipos de modelos y relaciones para fortalecer tu comprensión!
Curso de Desarrollo Web con Flask
Módulo 1: Introducción a Flask
- ¿Qué es Flask?
- Configuración de tu Entorno de Desarrollo
- Creando tu Primera Aplicación Flask
- Entendiendo la Estructura de una Aplicación Flask
Módulo 2: Conceptos Básicos de Flask
- Enrutamiento y Mapeo de URLs
- Manejo de Métodos HTTP
- Renderizando Plantillas con Jinja2
- Trabajando con Archivos Estáticos
Módulo 3: Formularios y Entrada de Usuario
Módulo 4: Integración de Bases de Datos
- Introducción a Flask-SQLAlchemy
- Definiendo Modelos
- Realizando Operaciones CRUD
- Migraciones de Base de Datos con Flask-Migrate
Módulo 5: Autenticación de Usuarios
- Registro de Usuarios
- Inicio y Cierre de Sesión de Usuarios
- Hashing de Contraseñas
- Gestión de Sesiones de Usuario
Módulo 6: Conceptos Avanzados de Flask
- Blueprints para Aplicaciones Grandes
- Manejo de Errores
- Páginas de Error Personalizadas
- Registro y Depuración
Módulo 7: APIs RESTful con Flask
- Introducción a las APIs RESTful
- Creación de Endpoints RESTful
- Manejo de Datos JSON
- Autenticación para APIs
Módulo 8: Despliegue y Producción
- Configuración de Flask para Producción
- Despliegue en Heroku
- Despliegue en AWS
- Monitoreo y Optimización del Rendimiento
Módulo 9: Pruebas y Mejores Prácticas
- Pruebas Unitarias con Flask
- Pruebas de Integración
- Cobertura de Pruebas
- Mejores Prácticas para el Desarrollo con Flask
