Relaciones y uniones
Modele tablas relacionadas
Relaciones y uniones es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.
Tablas relacionadas
Los datos reales están conectados: un autor tiene muchos libros y un pedido tiene muchos artículos. SQLAlchemy modela estos vínculos mediante relaciones y claves foráneas.
# Author 1 --- many --- Book
# A foreign key on Book points back to Author
print('One-to-many is the most common link')Claves foráneas
Una columna de clave foránea almacena la clave primaria de una fila relacionada. Declárela con ForeignKey('table.column').
from sqlalchemy import ForeignKey
from sqlalchemy.orm import Mapped, mapped_column
# author_id: Mapped[int] = mapped_column(ForeignKey('authors.id'))
print('ForeignKey links child to parent')Definir el elemento principal
El modelo principal usa relationship() para contener una colección de elementos secundarios.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from typing import List
class Base(DeclarativeBase):
pass
class Author(Base):
__tablename__ = 'authors'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
books: Mapped[List['Book']] = relationship(back_populates='author')
print('Author.books holds related Book objects')Definir el elemento secundario
El modelo secundario tiene la columna de clave foránea y un relationship() que apunta de vuelta al elemento principal.
from sqlalchemy import ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
class Base(DeclarativeBase):
pass
class Book(Base):
__tablename__ = 'books'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
author_id: Mapped[int] = mapped_column(ForeignKey('authors.id'))
author: Mapped['Author'] = relationship(back_populates='books')
print('Book.author points to its parent')back_populates
back_populates vincula las dos relaciones para que la actualización de un lado se refleje automáticamente en el otro.
# author.books.append(book) also sets book.author = author
# Both sides stay in sync automatically
print('back_populates keeps both sides consistent')Recorrer las relaciones
Una vez vinculada la relación, puede recorrerla como si fueran atributos normales: author.books es una lista y book.author es el objeto principal.
# for book in author.books:
# print(book.title)
# print(book.author.name)
print('Navigate with plain attribute access')Construir un grafo
Agregue elementos secundarios a la colección del elemento principal. Al agregar el elemento principal a la sesión, la operación se propaga a los elementos secundarios.
# a = Author(name='Rowling')
# a.books.append(Book(title='Book 1'))
# session.add(a)
# session.commit() # author and book both saved
print('Cascade saves the whole object graph')Uniones implícitas
Acceder a book.author hace que SQLAlchemy cargue automáticamente la fila relacionada (carga diferida) en segundo plano.
# Accessing book.author runs a SELECT if not loaded yet
# This is lazy loading
print('Lazy loading fetches related rows on access')Uniones explícitas
Para filtrar entre tablas, use join() en una consulta select. Esto genera una unión SQL.
from sqlalchemy import select
# stmt = select(Book).join(Author).where(Author.name == 'Rowling')
# books = session.scalars(stmt).all()
print('join(Author) filters across the relationship')Carga anticipada
Para evitar muchas consultas pequeñas, cargue de antemano las filas relacionadas con joinedload o selectinload.
from sqlalchemy import select
from sqlalchemy.orm import selectinload
# stmt = select(Author).options(selectinload(Author.books))
print('selectinload preloads children in one extra query')Muchos a muchos
Para los vínculos de muchos a muchos, una tabla de asociación conecta ambos lados. relationship() usa secondary= para apuntar a ella.
# students <-> courses via a 'enrollments' association table
# courses: Mapped[List['Course']] = relationship(secondary=enrollments)
print('secondary= models many-to-many')Comprobación rápida
Ponga a prueba sus conocimientos sobre las relaciones.
Recapitulación
Aprendió a modelar tablas relacionadas.
ForeignKeyalmacena el vínculo en la columna del elemento secundariorelationship()conback_populatesconecta ambos lados- Recorra los vínculos como atributos normales; la carga diferida obtiene los datos al acceder a ellos
join()filtra entre tablas;selectinloadcarga de forma anticipada;secondary=gestiona las relaciones de muchos a muchos
Preguntas frecuentes
¿La lección «Relaciones y uniones» es gratis?
Sí — el texto completo de «Relaciones y uniones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Relaciones y uniones»?
Modele tablas relacionadas Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Python Academy?
No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Relaciones y uniones»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Python Academy?
Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- SQLAlchemy Core frente a ORM
- Definición de modelos
- Consultas con Session
- Relaciones y uniones