124 подписчика
· 25.11.2024Вопрос
Что такое ORM? Какие плюсы и минусы несет использование? Работали с DjangoORM, SQLAlchemy? В чем заметны их отличия?
11 комментов
· 25.11.2024
ORM (Object-Relational Mapping) - это инструмент, позволяющий абстрагировать работу с базой данных, представляя ее в виде объектов в коде. Плюсы использования ORM заключаются в повышении производительности разработки, более чистом и понятном коде, а также повышенной безопасности данных. Однако, некоторые минусы включают возможные проблемы с производительностью и сложностью управления базой данных.
Они оба позволяют работать с базами данных с помощью объектов и запросов на языке Python, однако у них есть свои отличия. Django ORM предоставляет больше готовых инструментов и функций для удобного взаимодействия с базой данных, в то время как SQLAlchemy предоставляет более гибкий и расширяемый набор возможностей для работы с данными.
0
ответить
коммент удалён
· 25.11.2024
Удивительно, но на этот вопрос не ответит большинство разработчиков.
А ответ в названии — объектно-реляционное отображение.
Казалось бы ну и что тут такого? А стоит присмотреться к первому слову. Что мы знаем об объектах? Ну это штука, которая содержит данные и поведение вокруг этих данных. Да, там ещё есть вот эти вот всякие инкапсуляции, наследования, полиморфизмы.
Так вот именно об этом и есть ORM. Это не структурно/датаклассово-реляционное отображение, а именно объектно.
Поэтому в классах ORM создавайте методы, которые нужны для защиты инвариантов данных, а сами данные закрывайте для модификации снаружи (например из контроллеров)
0
ответить
коммент удалён
· 25.11.2024
Опа, а что такое структурно/датаклассово-реляционное отображение?
0
ответить
ответ удалён
· 25.11.2024
Я имел в виду анемичную модель данных, в противовес богатой. Не лучший термин подобрал
0
ответить
ответ удалён
· 28.11.2024
Не уверен, но для инкапсуляции бизнесовой логики как будто есть Entity и агрегаты с фабриками, а ORMкой можно реализовать Repository, который будет с ними связан.
0
ответить
ответ удалён
· 28.11.2024
Та же сессия из sqlalchemy или например entity framework из .net и так реализуют паттерн репозиторий. Крутить поверх него что-то сверху выглядит сомнительным.
Энтити, агрегаты и вэлью обжекты как-то должны быть сохранены и загружены из базы данных. Энтити, агрегаты и VO это объекты. Orm как раз и позволяет сохранять и загружать объекты.
0
ответить
ответ удалён
· 28.11.2024
Давно не читал сложно о простом
0
ответить
ответ удалён
· 28.11.2024
мне трудно это подтвердить или опровергнуть т.к. я не работал с ORM в целом как с явлением. только в общих чертах представляю что это и как работает.
однако на мой взгляд репозиторий - это абстракция доменной области. здесь должен быть только определён интерфейс, а ORM можно использовать для его реализации на ифраструктурном уровне.
у репозитория простая роль - инкапсулировать работу с хранилищем. а если вы предлагаете наследовать сущности и агрегаты от базовых классов конкретной ORM - мне кажется это неправильным потому что зависимости должны быть в другом направлении.
0
ответить
ответ удалён
· 28.11.2024
По поводу репозитория и его места в слоях пока что не готов ответить сходу.
По поводу наследования сущностей от базовых классов — вы абсолютно правы. Но наследовать свои сущности от базовых классов никто не обязывает. Классы, находящиеся в доменном слое можно маппить в инфраструктурном слое при помощи императивного марпинга в той же алхимии https://docs.sqlalchemy.org/en/20/orm/mapping_styles.html#imperative-mapping .
Так зависимости будут направлены в нужную сторону
0
ответить
ответ удалён
· 28.11.2024
Да, посмотрел, подумал, судя по всему всё же надо делать свой репозиторий.
В домене интерфейс, в инфре реализация вокруг сессии алхимии.
0
ответить
ответ удалён
· 29.11.2024
Просто работа с данными, чтобы избежать лишней писанины
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён