Определение моделей
Сопоставляйте классы с таблицами
«Определение моделей» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Модели сопоставляются с таблицами
В ORM SQLAlchemy модель — это класс Python, сопоставленный с таблицей базы данных. Каждый экземпляр становится строкой.
Модели наследуются от общего класса Base.
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
print('Base class ready')Атрибут __tablename__
Каждая модель задаёт __tablename__, чтобы назвать свою таблицу. SQLAlchemy использует это имя при создании 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__)Столбцы с помощью Mapped
Современный SQLAlchemy объявляет столбцы с помощью подсказок типов: Mapped[int] и mapped_column(). Подсказка типа задаёт тип Python и сообщает тип столбца.
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')Первичный ключ
Отметьте столбец как первичный ключ с помощью primary_key=True. Целочисленные первичные ключи по умолчанию увеличиваются автоматически.
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')Необязательные столбцы
Используйте Mapped[str | None] или Optional[str], чтобы разрешить значения NULL. Обычный Mapped[str] означает 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')Значения по умолчанию и уникальность
mapped_column() принимает такие параметры, как unique=True и default=, чтобы добавлять ограничения и значения по умолчанию.
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')Длина строки
Для баз данных, которым это требуется, задайте длину строки с помощью 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')Создание схемы
Base.metadata.create_all(engine) создаёт таблицы для каждой модели, наследующейся от 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')Создание экземпляров
Создайте строку, вызвав модель как обычный объект Python и передав значения столбцов в виде именованных аргументов.
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)Добавление __repr__
Пользовательский __repr__ упрощает отладку, наглядно показывая данные объекта.
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')))Модели остаются обычными объектами Python
Модель по-прежнему является обычным классом. Вы можете добавлять методы и свойства, работающие с её данными, объединяя поведение с сохранением данных.
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())Быстрая проверка
Проверьте свои навыки определения моделей.
Итоги
Вы научились определять модели ORM.
- Модели наследуются от
DeclarativeBaseи задают__tablename__ - В столбцах используются
Mapped[type]иmapped_column() primary_key,uniqueиdefaultдобавляют ограниченияcreate_all()создаёт таблицы
Часто задаваемые вопросы
Урок «Определение моделей» бесплатный?
Да — полный текст урока «Определение моделей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Определение моделей»?
Сопоставляйте классы с таблицами Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Определение моделей»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- SQLAlchemy Core и ORM
- Определение моделей
- Запросы через Session
- Связи и объединения