> For the complete documentation index, see [llms.txt](https://myroslavs-organization.gitbook.io/orm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://myroslavs-organization.gitbook.io/orm/system-architecture-and-implementation/migrations.md).

# Migrations

В цьому розділі я поясню як реалізовані міграції в моїй ORM системі

#### Концепція Системи Міграцій

Система міграцій у моїй ORM забезпечує зручний спосіб управління змінами в структурі бази даних. Вона складається з двох основних компонентів: ORM та ORM-CLI. Ось як система міграцій працює:

**Основні Компоненти**

1. **ORM**:
   * Відповідає за управління станом бази даних та синхронізацію структури бази даних з кодом вашого додатка.
   * Зберігає інформацію про структуру бази даних у вигляді "злитків".
2. **ORM-CLI**:
   * Керує процесом створення та застосування міграцій.
   * Порівнює поточний стан бази даних з останнім злитком і генерує нові міграції на основі змін.

**Процес Роботи Системи Міграцій**

1. **Створення Злитка**

   При кожному запуску вашої програми ORM автоматично створює "злиток" (snapshot) поточного стану бази даних. Цей злиток містить інформацію про таблиці, колонки, тригери, індекси та інші компоненти бази даних. Злиток записується у таблицю `current_database_ingot`, яка постійно синхронізується з поточним станом бази даних.

   * **Важливість ID**: До кожного елемента (таблиці, колонки, тригера, індекса) додається унікальний ідентифікатор (ID). Це дозволяє легко порівнювати зміни між злитками та попередніми міграціями.
2. **Порівняння Міграцій**

   При запуску ORM-CLI для створення нової міграції, система порівнює останній злиток з `current_database_ingot`. Це порівняння дозволяє виявити всі зміни, що відбулися з моменту останньої міграції, і включити їх у нову міграцію.

   * **Створення Міграцій**: На основі виявлених змін генерується SQL-код для нової міграції. Цей код зберігається разом з міграцією для можливості подальшого відновлення або повторного застосування.
3. **Зберігання SQL Коду**

   Кожна міграція зберігає SQL-код, що використовувався для її виконання. Це забезпечує:

   * **Точність**: Якщо потрібно відновити міграцію або переглянути її історію, завжди можна скористатися оригінальним SQL-кодом, а не динамічно згенерованим.
   * **Можливість Редагування**: Користувачі можуть додавати власний функціонал до міграцій. Після успішного виконання міграції код більше не може бути змінений, що запобігає помилкам.
4. **Динамічне Формування Міграцій**

   ORM підтримує динамічне формування міграцій, що може бути корисним, але іноді неточним. Тому зберігання оригінального SQL-коду є важливим для забезпечення правильності застосування міграцій.

**Переваги та Унікальні Особливості**

* **Ідентифікатори**: Використання ID для кожного елемента дозволяє точніше відстежувати та управляти змінами.
* **Збереження SQL**: Збереження SQL-коду міграцій забезпечує точність та можливість відновлення.
* **Редагування Після Виконання**: Можливість додавання функціоналу до міграцій та захист від змін після успішного застосування підвищує гнучкість системи.

Цей підхід забезпечує надійний і масштабований спосіб управління змінами в базі даних, що робить мій додаток більш гнучким і стійким до змін у структурі бази даних.
