Relacionamentos e junções
Modele tabelas relacionadas
Relacionamentos e junções é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Python Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Python Academy inclui 4 aulas no total.
Tabelas relacionadas
Dados reais estão conectados: um autor tem muitos livros, e um pedido tem muitos itens. O SQLAlchemy representa essas conexões com relacionamentos e chaves estrangeiras.
# Author 1 --- many --- Book
# A foreign key on Book points back to Author
print('One-to-many is the most common link')Chaves estrangeiras
Uma coluna de chave estrangeira armazena a chave primária de uma linha relacionada. Declare-a com 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')Definindo o pai
O modelo pai usa relationship() para armazenar uma coleção de elementos filhos.
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')Definindo o filho
O modelo filho tem a coluna de chave estrangeira e uma relationship() que aponta de volta para o pai.
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 conecta os dois relacionamentos para que uma alteração em um lado seja automaticamente refletida no outro.
# author.books.append(book) also sets book.author = author
# Both sides stay in sync automatically
print('back_populates keeps both sides consistent')Navegando pelos relacionamentos
Depois de conectados, você percorre os relacionamentos como atributos normais: author.books é uma lista, e book.author é o objeto pai.
# for book in author.books:
# print(book.title)
# print(book.author.name)
print('Navigate with plain attribute access')Construindo um grafo
Adicione os elementos filhos à coleção do pai. Adicionar o pai à sessão propaga essa ação aos filhos.
# 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')Junções implícitas
Acessar book.author faz o SQLAlchemy carregar automaticamente a linha relacionada nos bastidores (carregamento tardio).
# Accessing book.author runs a SELECT if not loaded yet
# This is lazy loading
print('Lazy loading fetches related rows on access')Junções explícitas
Para filtrar entre tabelas, use join() em uma seleção. Isso gera um JOIN 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')Carregamento antecipado
Para evitar muitas consultas pequenas, carregue as linhas relacionadas antecipadamente com joinedload ou 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')Muitos para muitos
Para conexões muitos-para-muitos, uma tabela de associação conecta os dois lados. O relationship() usa secondary= para apontar para ela.
# students <-> courses via a 'enrollments' association table
# courses: Mapped[List['Course']] = relationship(secondary=enrollments)
print('secondary= models many-to-many')Verificação rápida
Teste seus conhecimentos sobre relacionamentos.
Recapitulação
Você modelou tabelas relacionadas.
ForeignKeyarmazena a conexão na coluna do filhorelationship()comback_populatesconecta os dois lados- Navegue pelas conexões como atributos comuns; o carregamento tardio busca os dados quando eles são acessados
join()filtra entre tabelas;selectinloadcarrega antecipadamente;secondary=gerencia relações muitos-para-muitos
Perguntas Frequentes
A aula “Relacionamentos e junções” é grátis?
Sim — o texto completo de “Relacionamentos e junções” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Python Academy, atualize para CoddyKit PRO. O curso de Python Academy inclui 4 aulas no total.
O que vou aprender em “Relacionamentos e junções”?
Modele tabelas relacionadas Você pratica Python Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Python Academy?
Nenhuma experiência prévia é necessária. Python Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Relacionamentos e junções”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Python Academy?
Sim. Cada aula de Python Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- SQLAlchemy Core versus ORM
- Definição de modelos
- Consultas com a Session
- Relacionamentos e junções