Декларативное отображение
При использовании декларативного подхода тело сопоставляемого класса в большинстве случаев включает атрибут __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.