Что такое ORM: зачем нужно и как использовать

Контент-маркетолог
Стаж 15 лет

Практика — лучший способ освоить новый инструмент и оценить все его преимущества. Обращаться к документации, писать в сообщество разработчиков — это здорово. Но не всегда достаточно. Если вы запутались в Object-Relational Mapping наша статья точно будет кстати.

Что такое Object-Relational Mapping

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

Благодаря преобразованию можно работать с данными в БД, используя объекты в своем программном коде, вместо того, чтобы напрямую писать SQL-запросы. Для этого Object-Relational Mapping автоматически преобразует объекты в записи таблиц базы данных и обратно. Это упрощает процесс разработки в объектно-ориентированных подходах, повышает уровень абстракции, позволяет работать с данными более интуитивным образом.

ORM формирует подобие такой «виртуальной объектной базы данных», которая существует лишь в коде приложения и затем синхронизируется уже с реальной базой данных.

Простыми словами, ORM — это инструмент для оптимизации работы с БД. 

Зачем нужно Object-Relational Mapping

Технология нужна для того, чтобы упростить разработку и сопровождение кода. Представьте, что вам нужно получить список пользователей из базы данных и отсортировать их по имени. Без этой технологии вам пришлось бы написать сложный SQL-запрос и преобразовать результаты в объекты на языке программирования. С ней же этот процесс автоматизируется, и вы можете сделать это одной строкой кода:

users = session.query(User).order_by(User.name).all()

Проблемы при работе с базами данных

Прямое взаимодействие с базами данных часто сопряжено с рядом негатива. Разработчику нужно писать сложные SQL-запросы, что требует глубокого знания синтаксиса SQL и также особенностей конкретной СУБД. Это может привести к ряду уже побочных сложностей:

  • Написание сложных SQL-запросов — это трудоемкий процесс, особенно для неопытных разработчиков. Поддержка — тоже.
  • При работе с разными таблицами часто приходится писать похожие запросы, что приводит к избыточности кода.
  •  Реляционная модель данных в БД не всегда соответствует объектной модели в коде приложения. Отсюда мы имеем дополнительные сложности при разработке.

Преимущества технологии

Рассмотрим наиболее важные из них.

Сокращение дублирования кода

Object-Relational Mapping позволяет значительно сократить объем повторяющегося кода при работе с базой данных глобально.

Пример: ручной SQL-запрос выглядит так:

INS ERT IN TO users (name, email, age) VALUES ('Ivan Petroff', '[email protected]', 30);

А так это выглядит с использованием Object-Relational Mapping (на примере Python и SQLAlchemy):

user = User(name='Ivan Petrof', email='[email protected]', age=30)
session.add(user)
session.commit()

Повышение абстракции

Также Object-Relational Mapping предоставляет более высокий уровень абстракции, позволяя работать с объектами вместо прямого взаимодействия с таблицами и столбцами БД.

Абстракция данных позволяет разработчикам сфокусироваться на бизнес-логике приложения, а не на деталях работы с базой данных. Это упрощает разработку, улучшает читаемость кода, снижает вероятность ошибок. Да и вообще код становится более логичным, красивым.

Пример: вместо написания SQL-запроса…

SEL ECT name, email FR OM users WHERE id=1;

…можно работать напрямую с объектами:

user = session.query(User).get(1)
print(user.name, user.email)

Улучшение переносимости

Технология обеспечивает независимость от конкретной СУБД, что упрощает перенос приложения между различными базами данных.

Object-Relational Mapping абстрагирует детали реализации конкретной СУБД, предоставляя унифицированный интерфейс для работы с разными базами данных. Это позволяет легко переключаться между различными СУБД без необходимости переписывать код приложения.

Пример: перенос приложения на другую СУБД без изменения кода Object-Relational Mapping будет достаточно наглядным для демонстрации этого преимущества. Предположим, вы используете SQLAlchemy с MySQL:

engine = create_engine('mysql://user:password@localhost/mydatabase')

Для перехода на PostgreSQL достаточно изменить строку подключения:

engine = create_engine('postgresql://user:password@localhost/mydatabase')

Код Object-Relational Mapping останется неизменным, что значительно упрощает процесс миграции.

Упрощение разработки

Инструмент существенно упрощает работу с базами данных и автоматизирует многие рутинные операции: создание таблиц, управление связями между объектами, генерацию SQL-запросов и многие другие аспекты работы с базами данных.

Больше не нужно сосредотачиваться на низкоуровневых деталях взаимодействия с каждой конкретной БД.

Пример: посмотрим как происходит создание, чтение, обновление и удаление данных с помощью Object-Relational Mapping:

# Создание
new_user = User(name='Sergo', email='[email protected]', age=25)
session.add(new_user)
session.commit()

# Чтение
user = session.query(User).filter_by(name='Sergo').first()

# Обновление
user.age = 26
session.commit()

# Удаление
session.delete(user)
session.commit()

Как использовать Object-Relational Mapping

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

Для примера возьмём связку Python и SQLAlchemy.

Шаг 1. Устанавливаем библиотеку:

```python
pip install sqlalchemy
```

Шаг 2. Создаем экземпляр класса `Engine`. Он будет использоваться для подключения к базе данных:

```python


from sqlalchemy import create_engine

# Предположим, что у вас есть база данных SQLite с именем 'my_database.db'
engine = create_engine('sqlite:///my_database.db')


```

Шаг 3. Создаем модель данных, которая будет соответствовать таблице в БД:

```python
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
__tablename__ = 'users'

id=Column(Integer, primary_key=True)
username = Column(String)
email = Column(String)


```

Шаг 4. Создаем таблицу в базе данных, если она еще не существует:

```python

Base.metadata.create_all(engine)
```

Шаг 5. Используем простой `Session` для управления транзакциями и сессиями с базой данных:

```python
from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()
```

Шаг 6. Записываем в базу данных:

```python
user = User(username='Sergo', email='[email protected]')
session.add(user)
session.commit()
```

Шаг 7. Получаем информацию из базы данных:

```python
query = session.query(User).filter(User.id == 1)
user = query.one()
print(user.username)
```

Примечание: код создает экземпляр класса Engine для подключения к базе данных SQLite. Далее добавляем модель данных User с колонками id, username и email. После создаем таблицу users в базе данных, добавляя нового пользователя с учетными данными Sergo и [email protected], сохраняем в базе данных и выводим имя пользователя (Sergo) из запроса к базе данных.

Говоря о том, как использовать технологию, нельзя не сказать о фреймворках.

Выбор ORM-фреймворка

Их очень много. Расскажу про пять самых популярных.

  1. Hibernate. Мощный ORM-фреймворк для Java, который поддерживает множество баз данных, предоставляет богатый функционал.
  2. Django ORM. Встроенный ORM в веб-фреймворк Django, оптимизирован для быстрой разработки веб-приложений на Python.
  3. SQLAlchemy. Гибкий, мощный ORM для питониста. Поддерживает и высокоуровневые абстракции, и низкоуровневое SQL-программирование.
  4. Entity Framework. ORM-фреймворк от Microsoft для .NET. Очень тесно интегрированн с экосистемой .NET.
  5. Sequelize. ORM-фреймворк для Node.js, есть удобный API для работы с данными. А еще поддержка множества разных баз данных уже из коробки.

Совет: рекомендую начинать с изучения наиболее распространенных фреймворков в вашей области разработки. Например, если вы работаете с Python, стоит начать с Django ORM или SQLAlchemy.

Самые ходовые фреймворки для пяти популярных языков:

  1. Java: Hibernate, JPA, Spring Data JPA, MyBatis.
  2. C#: Entity Framework, Dapper, NHibernate.
  3. PHP: Doctrine, Eloquent (Laravel), Propel.
  4. Ruby: ActiveRecord (Rails), Sequel, DataMapper.
  5. Jav * aScript: Sequelize, Knex, Objection.js.

Основные понятия Object-Relational Mapping

Отображение объектов на таблицы — ключевой маркет. Мы уже говорили в начале, но напомним основной принцип:

Object-Relational Mapping позволяет сопоставлять классы в коде с таблицами в базе данных. Каждый экземпляр класса представляет собой строку в соответствующей таблице.

Отображение атрибутов на столбцы

Атрибуты класса сопоставляются со столбцами таблицы. Технология автоматически преобразует типы данных между языком программирования и базой данных.

Операции CRUD (Create, Read, Update, Delete)

Object-Relational Mapping дает нам методы для выполнения основных операций с данными, так называемых CRUD-операций.

Связи между объектами

Object-Relational Mapping позволяет определять и управлять связями между объектами по разным сценариям: «один-ко-многим», «многие-ко-многим» и «один-к-одному».

Пример: описываем отображения класса «Пользователь» на таблицу «users»:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
__tablename__ = 'users'

id=Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(120), unique=True)
age = Column(Integer)

def __repr__(self):
return f"<User(name='{self.name}', email='{self.email}', age={self.age})>"

Мы видим, что класс User отображается на таблицу users. Атрибуты класса (id, name, email, age) полностью соответствуют столбцам таблицы.

Более сложные концепции

В Object-Relational Mapping существует ряд и более сложных концепций, которые могут быть полезны при разработке сложных приложений.

Наследование. ORM позволяет отображать иерархии наследования классов на структуры таблиц в базе данных.

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

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

Кэширование. Многие подобные инструменты предоставляют механизмы кэширования для уменьшения количества запросов к базе данных и повышения производительности.

Для более глубокого изучения технологий нужно будет потратить время. Я рекомендую обратиться к официальной документации выбранного фреймворка или сразу же к специализированным ресурсам:

Коротко о главном

  1. Object-Relational Mapping — мощный инструмент, который значительно упрощает работу с базами данных в современных подходах программирования.
  2. Он позволяет работать с базами данных, используя обычные объекты сразу в коде вместо того, чтобы писать сложные запросы к базе данных, а также ускоряет процесс написания кода.
  3. Кроме того, сокращает объем кода и уменьшает дублирование, повышает уровень абстракции кода, улучшает переносимость приложений между различными СУБД и т. д. 

Оценить статью
Нет ответов

Комментарии

Написать комментарий
Популярные статьи автора
Узнайте стоимость продвижения сейчас
Выберите удобный способ связи:
Выберите удобный способ связи:
Введите Ваш номер телефона:
Введите адрес Вашего сайта:
Введите Ваше имя:
Нажимая кнопку «Получить предложение» вы соглашаетесь с Политикой конфиденциальности.
Введите Ваш Email:
Введите адрес Вашего сайта:
Введите Ваше имя:
Нажимая кнопку «Получить предложение» вы соглашаетесь с Политикой конфиденциальности.
Оперативно отвечаем в рабочее время: с 10:00 до 19:00
Оперативно отвечаем в рабочее время: с 10:00 до 19:00
Вы уже проголосовали
Возьмем ТОП вместе?
Нажимая кнопку «Оставить заявку» вы соглашаетесь с Политикой конфиденциальности.
Цена лидов в различных нишах
Тематика Стоимость лида (Москва/Россия)
Отдых 500
Мебель 350
Оборудование 500
Бансковские услуги 500
Безопасность 500
Организация мероприятий, концерты, праздники 500
Недвижимость 500
Строительство и отделка 500
Грузоперевозки 500
Доставка еды 350
Юридические услуги 500
Бухгалтерские услуги 500
Пластиковые окна 500
Детские товары 350
Автозапчасти 350
Образование 500
Возьмем ТОП вместе?
Нажимая кнопку «Оставить заявку» вы соглашаетесь с Политикой конфиденциальности.
Оставить заявку сейчас
Выберите интересующую услугу *
Нажимая кнопку «Оставить заявку» вы соглашаетесь с Политикой конфиденциальности.
Подпишитесь на рассылку
Не пропустите самое интересное из мира SEO и Digital. Только актуальные и самые крутые статьи.
Заявка успешно отправлена!
Наши сотрудники уже приступили к анализу Вашего сайта. Наш менеджер свяжется с вами в течение дня, спасибо!