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 columnaid
de 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 columnaid
de 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 modeloComment
con una relaciónMany-to-One
conPost
.post_id
: Clave foránea que referencia la columnaid
de 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