Definição de modelos
Mapeie classes para tabelas
Definição de modelos é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 2 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.
Os modelos são associados a tabelas
No mapeamento objeto-relacional do SQLAlchemy, um modelo é uma classe Python associada a uma tabela do banco de dados. Cada instância se torna uma linha.
Os modelos herdam de uma classe Base compartilhada.
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
print('Base class ready')O __tablename__
Cada modelo define __tablename__ para nomear sua tabela. O SQLAlchemy usa esse valor ao gerar SQL.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
print(User.__tablename__)Colunas com Mapped
O SQLAlchemy moderno declara colunas com anotações de tipo: Mapped[int] e mapped_column(). A anotação de tipo define o tipo Python e informa o tipo da coluna.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
age: Mapped[int]
print('User has id, name, age')A chave primária
Marque uma coluna como chave primária com primary_key=True. As chaves primárias inteiras são incrementadas automaticamente por padrão.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Product(Base):
__tablename__ = 'products'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
print('id is the primary key')Colunas opcionais
Use Mapped[str | None] ou Optional[str] para permitir valores NULL. Um Mapped[str] simples corresponde a NOT NULL.
from typing import Optional
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
nickname: Mapped[Optional[str]]
print('nickname can be NULL')Valores padrão e exclusividade
mapped_column() aceita opções como unique=True e default= para adicionar restrições e valores substitutos.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
email: Mapped[str] = mapped_column(unique=True)
active: Mapped[bool] = mapped_column(default=True)
print('email is unique, active defaults to True')Comprimento de texto
Para bancos de dados que exigem isso, defina o comprimento de uma cadeia de caracteres com mapped_column(String(50)).
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(50))
print('name limited to 50 chars')Criando o esquema
Base.metadata.create_all(engine) cria tabelas para todos os modelos que herdam de Base.
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print('Schema created')Criando instâncias
Crie uma linha instanciando o modelo como um objeto Python comum e passando os valores das colunas como argumentos nomeados.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
u = User(name='Alice')
print(u.name)Adicionando um __repr__
Um __repr__ personalizado facilita a depuração ao exibir claramente os dados do objeto.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
def __repr__(self):
return 'User(name=' + self.name + ')'
print(repr(User(name='Bob')))Os modelos continuam sendo Python comum
Um modelo ainda é uma classe comum. Você pode adicionar métodos e propriedades que operem sobre seus dados, combinando comportamento com persistência.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = 'users'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
def greet(self):
return 'Hi, ' + self.name
print(User(name='Carol').greet())Verificação rápida
Teste suas habilidades de definição de modelos.
Recapitulação
Você aprendeu a definir modelos de mapeamento objeto-relacional.
- Os modelos herdam de uma
DeclarativeBasee definem__tablename__ - As colunas usam
Mapped[type]emapped_column() primary_key,uniqueedefaultadicionam restriçõescreate_all()cria as tabelas
Perguntas Frequentes
A aula “Definição de modelos” é grátis?
Sim — o texto completo de “Definição de modelos” é 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 “Definição de modelos”?
Mapeie classes para tabelas 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 2 de 4.
Quanto tempo leva a aula “Definição de modelos”?
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