Что такое орм в программировании
Что такое 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- запросов, который будет использоваться при тех или иных действиях (сохранение в базу данных, загрузка, поиск и т. д.) с постоянным объектом.