0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<blockquote><p>Это обзорный урок, который показывает общие концепции присущие ORM. Каждая из этих концепций будет далее рассматриваться в курсе</p>
1
<blockquote><p>Это обзорный урок, который показывает общие концепции присущие ORM. Каждая из этих концепций будет далее рассматриваться в курсе</p>
2
</blockquote><p>ORM (Object-Relation Mapping) - общее название для фреймворков или библиотек, позволяющих автоматически связать базу данных с кодом. Они стараются скрыть существование базы данных настолько, насколько это возможно. Взамен программисту дают возможность оперировать данными в базе через специальный интерфейс. Вместо построения SQL-запросов, программист вызывает простые методы, а всю остальную работу берёт на себя ORM.</p>
2
</blockquote><p>ORM (Object-Relation Mapping) - общее название для фреймворков или библиотек, позволяющих автоматически связать базу данных с кодом. Они стараются скрыть существование базы данных настолько, насколько это возможно. Взамен программисту дают возможность оперировать данными в базе через специальный интерфейс. Вместо построения SQL-запросов, программист вызывает простые методы, а всю остальную работу берёт на себя ORM.</p>
3
<p>Несмотря на общую цель, ORM бывают очень разными. Django ORM относится к наиболее распространённому и простому типу ORM, реализующему шаблон проектирования Active Record. Этот шаблон базируется на идее, что каждой таблице в приложении соответствует один класс (модель). Этот класс отвечает как за реализацию бизнес логики, так и за взаимодействие с базой данных. Последнее обычно появляется в модели за счёт наследования от базового класса ORM.</p>
3
<p>Несмотря на общую цель, ORM бывают очень разными. Django ORM относится к наиболее распространённому и простому типу ORM, реализующему шаблон проектирования Active Record. Этот шаблон базируется на идее, что каждой таблице в приложении соответствует один класс (модель). Этот класс отвечает как за реализацию бизнес логики, так и за взаимодействие с базой данных. Последнее обычно появляется в модели за счёт наследования от базового класса ORM.</p>
4
<blockquote><p>Кроме Active Record существует шаблон Data Mapper, он например реализован в<a>SQLAlchemy</a>. Этот подход разделяет сущности и код, связанный с базой данных, на два независимых слоя. Такой подход гибче, но при этом сложнее в работе.</p>
4
<blockquote><p>Кроме Active Record существует шаблон Data Mapper, он например реализован в<a>SQLAlchemy</a>. Этот подход разделяет сущности и код, связанный с базой данных, на два независимых слоя. Такой подход гибче, но при этом сложнее в работе.</p>
5
</blockquote><h2>Модель</h2>
5
</blockquote><h2>Модель</h2>
6
<p>Каждый объект данного класса соответствует одной записи в таблице. За преобразования данных в объекты и обратно, отвечает ORM. Программисту лишь нужно использовать правильные методы для извлечения объектов и их модификации.</p>
6
<p>Каждый объект данного класса соответствует одной записи в таблице. За преобразования данных в объекты и обратно, отвечает ORM. Программисту лишь нужно использовать правильные методы для извлечения объектов и их модификации.</p>
7
<h2>Выборки</h2>
7
<h2>Выборки</h2>
8
<p>Важная часть любой ORM - это Query Builder (построитель запросов). Это абстракция поверх SQL, которая упрощает генерацию запросов. Она обычно выглядит как цепочка функций, каждая из которых отвечает за конкретную часть SQL, например: ORDER, SELECT или WHERE.</p>
8
<p>Важная часть любой ORM - это Query Builder (построитель запросов). Это абстракция поверх SQL, которая упрощает генерацию запросов. Она обычно выглядит как цепочка функций, каждая из которых отвечает за конкретную часть SQL, например: ORDER, SELECT или WHERE.</p>
9
<p>Django ORM позволяет описывать достаточно сложные запросы, и большинство задач вы сможете решать именно с помощью Query Builder. Однако существует и возможность делать запросы напрямую:</p>
9
<p>Django ORM позволяет описывать достаточно сложные запросы, и большинство задач вы сможете решать именно с помощью Query Builder. Однако существует и возможность делать запросы напрямую:</p>
10
<p>Мы не рекомендуем по умолчанию использовать запросы, написанные вручную. Оставьте эту возможность для тех немногих случаев, когда Query Builder не может сформировать эффективный запрос.</p>
10
<p>Мы не рекомендуем по умолчанию использовать запросы, написанные вручную. Оставьте эту возможность для тех немногих случаев, когда Query Builder не может сформировать эффективный запрос.</p>
11
<h2>Схема</h2>
11
<h2>Схема</h2>
12
<p>Ещё одна обязанность ORM - изменение схемы базы данных: добавление, удаление и модификация таблиц. Делается это, как правило, не на чистом SQL, а с помощью специального языка. Это позволяет работать с ORM, не отвлекаясь на особенности конкретных баз данных.</p>
12
<p>Ещё одна обязанность ORM - изменение схемы базы данных: добавление, удаление и модификация таблиц. Делается это, как правило, не на чистом SQL, а с помощью специального языка. Это позволяет работать с ORM, не отвлекаясь на особенности конкретных баз данных.</p>
13
<p>В Django ORM первостепенными являются модели - вы изменяете код, а потом используете средства для приведения схемы базы данных в соответствие новому состоянию кода. Такой подход называется<em>Code First</em>.</p>
13
<p>В Django ORM первостепенными являются модели - вы изменяете код, а потом используете средства для приведения схемы базы данных в соответствие новому состоянию кода. Такой подход называется<em>Code First</em>.</p>
14
<blockquote><p>Также существует подход Database First: вы сначала меняете базу данных, выполняя SQL-запросы или формируя запросы с помощью средств ORM, а затем ORM уже сама подхватывает изменения и адаптирует модели. Например, для добавления нового свойства достаточно добавить новую колонку. В коде ничего менять не нужно, она автоматически начинает работать.</p>
14
<blockquote><p>Также существует подход Database First: вы сначала меняете базу данных, выполняя SQL-запросы или формируя запросы с помощью средств ORM, а затем ORM уже сама подхватывает изменения и адаптирует модели. Например, для добавления нового свойства достаточно добавить новую колонку. В коде ничего менять не нужно, она автоматически начинает работать.</p>
15
</blockquote><h2>Миграции</h2>
15
</blockquote><h2>Миграции</h2>
16
<p>Любая база данных в процессе жизни приложения изменяется. В неё добавляются новые таблицы, удаляются старые, какие-то меняются. Этот процесс никогда не заканчивается. Изменения в базе данных выполняются с помощью механизма миграций.</p>
16
<p>Любая база данных в процессе жизни приложения изменяется. В неё добавляются новые таблицы, удаляются старые, какие-то меняются. Этот процесс никогда не заканчивается. Изменения в базе данных выполняются с помощью механизма миграций.</p>
17
<p>В Django ORM миграция - это Python модуль, который содержит описание действий, изменяющих схему базы данных. Учебный проект содержит пример миграции, но если вы этот файл откроете в редакторе, количество кода может вас смутить. К счастью, этот код не написан вручную - миграции Django генерирует самостоятельно. Модифицировать же вручную модули миграций приходится достаточно редко.</p>
17
<p>В Django ORM миграция - это Python модуль, который содержит описание действий, изменяющих схему базы данных. Учебный проект содержит пример миграции, но если вы этот файл откроете в редакторе, количество кода может вас смутить. К счастью, этот код не написан вручную - миграции Django генерирует самостоятельно. Модифицировать же вручную модули миграций приходится достаточно редко.</p>
18
<p>Попробуем добавить поле "nickname" к полям модели User из учебного проекта:</p>
18
<p>Попробуем добавить поле "nickname" к полям модели User из учебного проекта:</p>
19
<p>Модель изменилась, нужно сгенерировать миграцию:</p>
19
<p>Модель изменилась, нужно сгенерировать миграцию:</p>
20
<p>Теперь миграцию нужно применить:</p>
20
<p>Теперь миграцию нужно применить:</p>
21
<p>В процессе выполнения этой команды, автоматически проверяются, какие миграции уже были применены, а какие - нет. Применяются только те миграции, которые ещё не выполнены на текущей базе данных.</p>
21
<p>В процессе выполнения этой команды, автоматически проверяются, какие миграции уже были применены, а какие - нет. Применяются только те миграции, которые ещё не выполнены на текущей базе данных.</p>