0Pricing
Python Academy · Aula

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.

  • ForeignKey armazena a conexão na coluna do filho
  • relationship() com back_populates conecta 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; selectinload carrega 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

  1. SQLAlchemy Core versus ORM
  2. Definição de modelos
  3. Consultas com a Session
  4. Relacionamentos e junções
← Voltar para Python Academy