arrow

назад

ask

Вопрос

Что такое ORM? Какие плюсы и минусы несет использование? Работали с DjangoORM, SQLAlchemy? В чем заметны их отличия?

repost

1109

input message

напишите коммент


11 комментов

Просто работа с данными, чтобы избежать лишней писанины

0

ответить

ORM (Object-Relational Mapping) - это инструмент, позволяющий абстрагировать работу с базой данных, представляя ее в виде объектов в коде. Плюсы использования ORM заключаются в повышении производительности разработки, более чистом и понятном коде, а также повышенной безопасности данных. Однако, некоторые минусы включают возможные проблемы с производительностью и сложностью управления базой данных.

Они оба позволяют работать с базами данных с помощью объектов и запросов на языке Python, однако у них есть свои отличия. Django ORM предоставляет больше готовых инструментов и функций для удобного взаимодействия с базой данных, в то время как SQLAlchemy предоставляет более гибкий и расширяемый набор возможностей для работы с данными.

0

ответить

Удивительно, но на этот вопрос не ответит большинство разработчиков.

А ответ в названии — объектно-реляционное отображение.

Казалось бы ну и что тут такого? А стоит присмотреться к первому слову. Что мы знаем об объектах? Ну это штука, которая содержит данные и поведение вокруг этих данных. Да, там ещё есть вот эти вот всякие инкапсуляции, наследования, полиморфизмы.

Так вот именно об этом и есть ORM. Это не структурно/датаклассово-реляционное отображение, а именно объектно.

Поэтому в классах ORM создавайте методы, которые нужны для защиты инвариантов данных, а сами данные закрывайте для модификации снаружи (например из контроллеров)

0

ответить

Опа, а что такое структурно/датаклассово-реляционное отображение?

0

ответить

Я имел в виду анемичную модель данных, в противовес богатой. Не лучший термин подобрал

0

ответить

Не уверен, но для инкапсуляции бизнесовой логики как будто есть Entity и агрегаты с фабриками, а ORMкой можно реализовать Repository, который будет с ними связан.

0

ответить

Та же сессия из sqlalchemy или например entity framework из .net и так реализуют паттерн репозиторий. Крутить поверх него что-то сверху выглядит сомнительным.

Энтити, агрегаты и вэлью обжекты как-то должны быть сохранены и загружены из базы данных. Энтити, агрегаты и VO это объекты. Orm как раз и позволяет сохранять и загружать объекты.

0

ответить

Давно не читал сложно о простом

0

ответить

мне трудно это подтвердить или опровергнуть т.к. я не работал с ORM в целом как с явлением. только в общих чертах представляю что это и как работает.

однако на мой взгляд репозиторий - это абстракция доменной области. здесь должен быть только определён интерфейс, а ORM можно использовать для его реализации на ифраструктурном уровне.

у репозитория простая роль - инкапсулировать работу с хранилищем. а если вы предлагаете наследовать сущности и агрегаты от базовых классов конкретной ORM - мне кажется это неправильным потому что зависимости должны быть в другом направлении.

0

ответить

По поводу репозитория и его места в слоях пока что не готов ответить сходу.

По поводу наследования сущностей от базовых классов — вы абсолютно правы. Но наследовать свои сущности от базовых классов никто не обязывает. Классы, находящиеся в доменном слое можно маппить в инфраструктурном слое при помощи императивного марпинга в той же алхимии https://docs.sqlalchemy.org/en/20/orm/mapping_styles.html#imperative-mapping .

Так зависимости будут направлены в нужную сторону

0

ответить

Да, посмотрел, подумал, судя по всему всё же надо делать свой репозиторий.

В домене интерфейс, в инфре реализация вокруг сессии алхимии.

0

ответить

еще контент в этом сообществе

пост закреплён — пока закрепить можно только один пост

trash bin
перейти к нему не получится