Что такое орм в программировании
Перейти к содержимому

Что такое орм в программировании

  • автор:

Что такое орм в программировании

Что такое ORM? ORM дословно Object Relational Mapping — объектно-реляционное связывание — комплекс программ, позволяющих работать с базами данных, как если бы они были объектами языка программирования, в данном случае Python.

Или иначе — ORM это набор классов, добавляющих еще один уровень абстракции к таблицам, хранящимся в базе данных. Эта абстракция позволяет работать с объектами БД как с объектами используемого языка программирования, не отвлекаясь на их преобразование в язык SQL. ORM целесообразно использовать в больших проектах, использующих БД, однако для повышения скорости выполнения запросов некоторые программисты предпочитают самостоятельно формировать нужные SQL-запросы. Причина в том, что в случае сложных запросов ORM не всегда генерирует оптимальный SQL-запрос к БД, что в случае большой выборки весьма существенно, особенно если выборка идет по нескольким таблицам. Несмотря на существующие недостатки, ORM широко распространены и существуют во многих языках программирования: Java, C#, PHP, Python, C++ и др.

Использовать ORM в ваших проектах или нет — решать Вам, однако я настоятельно рекомендую ознакомиться с этой технологией, так как она широко используется во многих сферах, в том числе в Java Enterprise.

На сегодняшний момент существует несколько ORM для Python, среди них:

Наиболее популярной является 1 и 2, однако 3 и 4 являются хорошей альтернативой.

Системы ORM 1 и 2 — это два больших монстра, хотя и позволяют выполнить многое, но как говорит гугл, в этом случае производительность по сравнению с обычным SQL-запросом падает до 3 раз.

Системы 3 и 4 позиционируются как легковесные, не обладают полным функционалом 1 и 2, но его достаточно для выполнения большинства сложных запросов. Стоит отметить, что их производительность по сравнению с 1 или 2 выше.

Для простоты рассмотрим особенности работы с PeeWee.

Для установки пакета с командной строке наберите pip install peewee .

Определение модели

Классы модели, поля и экземпляры сущности все отображаются на концепцию базы данных.

Термин Соответствие
Класс модели таблица в БД
Экземпляр поля столбец в таблице
Экземпляр сущности строка в таблице

При создании проекта с peewee , можно начать с определения модели.

from peewee import * # Создаем подключение к БД db = SqliteDatabase('people.db') class Person(Model): name=CharField() birthday=DateField() is_relative=BooleanField() # Здесь мы указываем соединение с БД class Meta: database=db 

В этом примере мы создаем подключение к базе данных SQLite (файл people.db) и определяем класс модели Person . В этом же классе в подклассе Meta расположена database — переменная соединения с БД.

Внимание! мы назвали нашу модель Person вместо People . Вы должны придерживаться этого правила, даже если таблица будет содержать множество людей, мы всегда назовем класс существительным в единственном числе.

В PeeWee определено много типов столбцов:

Field Type Sqlite Postgresql MySQL
CharField varchar varchar varchar
FixedCharField char char char
TextField text text longtext
DateTimeField datetime timestamp datetime
IntegerField integer integer integer
BooleanField integer boolean bool
FloatField real real real
DoubleField real double precision double precision
BigIntegerField integer bigint bigint
SmallIntegerField integer smallint smallint
DecimalField decimal numeric numeric
PrimaryKeyField integer serial integer
ForeignKeyField integer integer integer
DateField date date date
TimeField time time time
TimestampField integer integer integer
BlobField blob bytea blob
UUIDField text uuid varchar(40)
BareField untyped not supported not supported

Чтобы открыть соединение с БД нужно написать

и хотя в мануале пишут, что это не обязательно, тем не менее это хорошая практика, так как позволяет обнаружить ошибки при соединении.

Определение связей происходит при помощи внешнего ключа

class Pet(Model): owner = ForeignKeyField(Person, related_name='pets') name = CharField() animal_type = CharField() class Meta: database = db # this model uses the "people.db" database 

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

создание таблиц в БД происходит следующим образом:

db . create_tables ([ Person , Pet ])

сохранение экземпляра класса в БД происходит по команде:

grandma = Person . create ( name = ‘Grandma’ , birthday = date ( 1935 , 3 , 1 ), is_relative = True )

Подробная документация находится здесь

Прежде чем бросаться и писать ORM обертку для таблиц сущностей, сначала надо спроектировать логическую структуру БД или ХД. Установить все зависимости и способы взаимодействия между сущностями.

ORM SQLAlchemy

Работа с этой ORM начинается с импорта элементов из пакета sqlalchemy.

Для подключения к БД мы создаем объект Engine, который создает связку пула подключения и диалекта конкретной БД.

Далее нужно создать базовый класс для объявления сущностей наших данных

Потом мы описываем связываемые таблицы через наследование от класса Base .

from sqlalchemy import create_engine engine = create_engine('sqlite:///:memory:', echo=True) from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() from sqlalchemy import Column, Integer, String class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) fullname = Column(String) password = Column(String) def __repr__(self): return "" % ( self.name, self.fullname, self.password) 

В этом примере мы определили связку сущности User и таблицы users .

Для создания экземпляра сущности просто создайте объект класса User .

u = User ( name = ‘Isac’ , fullname = ‘Newton’ , password = ‘123’ )

Указывать параметры при вызове конструктора не обязательно, присвоить значения полям экземпляра сущности можно и после.

 u=User() u.name='Isac' u.fullname='Newton' u.password='123' 

Для того, чтобы связаться с базой данных и начать с ней диалог, создадим класс сессия.

from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) # и создадим экземпляр этого объекта session=Session() 

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

ed_user = User(name='ed', fullname='Ed Jones', password='edspassword') session.add(ed_user) session.add(u) session.commit() 

Обратите внимание, что после commit() поле id примет автоматически инициализированного значения. (id — первичный ключ, автоинкрементный)

ORM — Ключевые аспекты веб-разработки на Python

Любое программное обеспечение разрабатывается под конкретную предметную область, например:

  • Система аналитики оперирует понятиями «просмотр», «сессия», «воронка» и «когорта»
  • Для интернет-магазина понятия будут другими — «товар», «категория», «платежный шлюз».

Все вместе они составляют онтологию предметной области . В некоторых источниках встречается термин модель предметной области — это то же самое, что и онтология.

Кроме самих понятий онтология содержит и описание их связей. Например, сущность «Пользователь» связана с сущностью «Покупка» как «один ко многим». То есть один пользователь может выполнить сколько угодно покупок, но каждая покупка принадлежит только одному пользователю.

Модель предметной области — основа коммуникации и взаимопонимания между членами команды. Она не зависит ни от языка программирования, ни от программирования вообще.

Не важно, кто общается: программисты между собой или программисты с заказчиками, менеджерами или дизайнерами. Все вместе они оперируют сущностями и связями предметной области и бизнес-правилами, используемыми в данной программе. К таким правилам может относиться автоматическое включение скидки при заказе от определенного объема товаров:

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

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

На основе модели предметной области формируется модель данных в коде. Создаем сущности, определяем их связи. Затем мы строим рабочий код, который оперирует сущностями, исходя из требований и бизнес-правил.

На этом этапе возникает вопрос: а как эти сущности будут отображаться на базу данных, в которой они хранятся?

Самый простой вариант — создавать по таблице на каждую сущность и связывать их через внешние ключи. В большинстве проектов именно так и делают. Для этого используют Object-relational mapper (ORM) — фреймворк для данных.

С помощью ORM описываются сущности и их связи, а также определяется то, как сущность отображается на базу данных (как правило, в полуавтоматическом режиме). ORM берет на себя серьезную часть работы по:

  • Генерации SQL-запросов
  • Извлечению данных
  • Кастингу — преобразованию типов базы данных в типы целевого языка и обратно
  • Автоматическому извлечению связей

В итоге получается, что ORM прячет всю работу с базой данных. От программиста нужна только правильная конфигурация, а ORM сам выполняет все необходимые запросы. В сложных случаях их все равно приходится писать самостоятельно, но это не так сложно — ORM содержат в себе query builder, который упрощает генерацию SQL.

В экосистеме Python есть несколько ORM. Некоторые из них разрабатывались под конкретные фреймворки и поставляются с ними, другие вполне самостоятельны. Рассмотрим пример, реализованный с использованием Django ORM.

Определение сущности Photo:

from django.db import models class Photo(models.Model): title = models.CharField(max_length=200) image = models.ImageField() slug = models.SlugField() 
# получаем объекты из базы photos = Photo.objects.all() # передаем их в шаблон render(request, 'polls/detail.html', 'photos': photos>) 

Код, описывающий сущность, может показаться простым, однако степень автоматизации в Django ORM очень велика. Под капотом у такого простого кода скрыты создание сущности в БД и набор проверок значений, которые вы помещаете в модель.

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

  • Нормализацией
  • Внешними и первичными ключами
  • Индексами
  • Планом запроса
  • Языком SQL, чтобы менять структуры базы данных и манипулировать данными внутри базы

Затем можно перейти на уровень выполнения запросов из языка программирования. В Python для этого используются различные библиотеки вроде postgres . И только после всего этого стоит переходить к ORM. Все это будет далее в курсах.

Вот лишь некоторые темы, вовлеченные в код выше:

  • Entity-relation model
  • Domain-driven design
  • ActiveRecord / DataMapper
  • Identity map

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Блог

ORM — (Object Relative Mapping) — это паттерн проектирования, который позволяет наладить взаимосвязь между классом и таблицей в Базе Данных. ORM системы присутствуют в любом большом фреймворке — Laravel, ASP .Net, ORM Django и у многих других. Какие знания вам нужны, чтобы понять устройство ORM системы (и может быть, написать свою самостоятельно)? Во-первых, здесь не помешают знания объектно — ориентированного программирования, чтобы можно было создать класс с необходимыми полями и свойствами. Также, к каждой ORM системе необходимо разработать свою систему переноса полей (или свойств) класса внутрь таблиц большинства популярных баз данных — MySQL, PostgreSQL, и другие популярные реляционные БД. По сути каждому бекенд-программисту могут быть полезны глубокие знания по базам данных, например по сложным запросам, или по типам данных, которые работают в данной базе данных. ORM же позволяет программисту не вдаваться глубоко в структуру базы данных, а создать само описание таблицы в виде привычного и понятного класса, и затем сделать миграцию. Что такое миграция? Это процесс превращения класса в таблицу.

Это позволяет очень удобно распространять свой проект среди других программистов — они просто скачивают проект, доставляют необходимые библиотеки (в зависимости от языка и платформы) и запускают процесс миграции. После этого, они могут уже полноценно пользоваться ресурсом, регистрироваться, добавлять данные, и т.д. Кроме этого, если вдруг проект немного изменит свою структуру, нужно будет просто отредактировать класс, связанный с таблицей, и сделать рефреш, вместо достаточно продолжительных операций с базами данных. Давайте подведем итоги.

  • — Изучите популярные базы данных и типы переменных;
  • — Изучите подробно ООП на выбранном языке программирования
  • — Изучите самостоятельно базы данных и виды связей между таблицами.
  • — И изучите фреймворк, который популярен на рынке! Не забудьте вместе с ним изучить ORM систему, которая обычно используется совместно с ним.

Гайд для трудоустройства в IT. Навыки, профессии и возможности.

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

19 января 2024

Gradle — система сборки для Java, Kotlin и C++

Сегодня мы расскажем про систему сборки Gradle, которая широко используется, например, при сборке Java — приложений.

29 апреля 2021

Golang — востребованность и сферы применения

Сегодня мы решили рассказать, что из себя представляет язык программирования Golang — зачем он нужен, и как его можно использовать. Он был придуман в корпорации Google для того, чтобы разрабатывать быстрые и надежные бекенд – приложения (однако создан для того, чтобы писать, а не читать).

Что такое орм в программировании

ORM (Object-relational mapping, Объектно-реляционное отображение) — технология программирования преобразующая объекты (объектно-ориентированные языки программирования) в форму, в которой они могут быть сохранены в файлах или базах данных.

ORM избавляет программиста от написания большого количества кода, часто однообразного и подверженного ошибкам, тем самым значительно повышая скорость разработки. Большинство современных реализаций ORM позволяют программисту при необходимости самому жёстко задать код SQL- запросов, который будет использоваться при тех или иных действиях (сохранение в базу данных, загрузка, поиск и т. д.) с постоянным объектом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *