5.3 Введение в модели SQLAlchemy
4 из 4 шагов пройдено

Декларативное отображение

При использовании декларативного подхода тело сопоставляемого класса в большинстве случаев включает атрибут __tablename__, указывающий на строковое имя таблицы, которое должно быть сгенерировано вместе с сопоставлением.

class User(Base):
    __tablename__ = "user"

    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    fullname = Column(String)
    nickname = Column(String(30))

В приведенном выше примере декларативный метод построит конструкцию таблицы, которая эквивалентна следующему императивному виду:

user_table = Table(
    "user",
    Base.metadata,
    Column("id", Integer, primary_key=True),
    Column("name", String(50)),
    Column("fullname", String()),
    Column("nickname", String(30)),
)

Рассмотрим следующий код:

class User(Base):
    __tablename__ = "user"

    id = mapped_column(Integer, primary_key=True)
    name = mapped_column(String(50), nullable=False)
    fullname = mapped_column(String)
    nickname = mapped_column(String(30))

Пользователи SQLAlchemy версии 1.x заметят использование конструкции mapped_column(), которая является новой в версии SQLAlchemy 2.0. Эта ORM-специфическая конструкция предназначена, прежде всего, для замены использования Column только в декларативных связках, добавляя новые ORM-специфические удобные функции, и самое главное, для указания типизации. 

mapped_column() обычно используется с явной типизацией вместе с типом аннотации Mapped. Он также может использоваться без аннотаций, как Column используется в декларативных связках в стиле SQLAlchemy 1.x.

class User(Base):
    __tablename__ = "user"

    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(50))
    fullname: Mapped[Optional[str]]
    nickname: Mapped[Optional[str]] = mapped_column(String(30))

Конструкция mapped_column() способна получать информацию о конфигурации колонки из аннотаций типов PEP 484, связанных с атрибутом, объявленным в классе Declarative mapped. Эти аннотации типов, если они используются, должны присутствовать внутри специального класса SQLAlchemy, называемого Mapped, который указывает на конкретный тип данных Python внутри него.

В следующем шаге мы познакомимся с основными полями и их аргументами в моделях SQLAlchemy.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.