0Pricing
Python Academy · Урок

Определение моделей

Сопоставляйте классы с таблицами

«Определение моделей» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. SQLAlchemy Core и ORM
  2. Определение моделей
  3. Запросы через Session
  4. Связи и объединения
← Назад к Python Academy