JavaRush /Курси /Модуль 3: Django /Міграції в Django

Міграції в Django

Модуль 3: Django
Рівень 2 , Лекція 7
Відкрита

Міграції — це спосіб управління схемою бази даних у Django, який дозволяє автоматично відстежувати зміни, такі як додавання нових моделей, зміна їх структури або видалення таблиць. Грубо кажучи, міграції — це свого роду "історія змін бази даних", яка допомагає синхронізувати структуру бази даних з визначенням моделей у коді вашого Django-додатка.

Чому це важливо?

  • Автоматизація: міграції позбавляють нас від необхідності писати SQL-скрипти вручну (так-так, ніхто не хоче бути "тим самим чуваком", який випадково дропнув таблицю).
  • Історія змін: ви завжди можете простежити, які зміни вносилися в базу, і навіть повернути її до попередньої версії.
  • Синхронізація команди: коли над проєктом працює кілька людей, міграції допомагають усім легко підтримувати єдину структуру бази.

Можна провести аналогію з вашим улюбленим месенджером: уявіть, що в кожному чаті є можливість "відправити міграцію", щоб у всіх учасників була однакова структура даних (і ніхто випадково не залишився без доступу до ваших цікавих мемів).

Основні команди для роботи з міграціями

Django надає нам кілька інструментів для роботи з міграціями. Тепер давайте розберемося, як ними користуватися.

1. makemigrations: Створення міграцій

Ця команда генерує файли міграцій на основі змін у ваших моделях. Приклад:

python manage.py makemigrations

Що робить ця команда? Django уважно переглядає ваші моделі та перевіряє, чи є зміни. Наприклад, якщо ви додали нову модель або змінили поле існуючої моделі, Django створить файл міграції для цих змін.

Приклад: припустимо, у нас є така модель:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

Якщо ми додамо нове поле, скажімо, genre:

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    genre = models.CharField(max_length=50)  # Нове поле!

І запустимо makemigrations, Django створить файл міграції, в якому буде описано додавання нового стовпця в таблицю бази даних.

Такий файл створюється в папці migrations вашого застосунку. У нього може бути ім'я на кшталт 0002_add_genre_field.py.

2. migrate: застосування міграцій

Після того як міграції створені, потрібно їх застосувати, щоб зміни набули чинності в базі даних.

python manage.py migrate

Ця команда синхронізує вашу базу даних з поточним станом міграцій. Django виконає SQL-запити, вказані у файлах міграцій.

Якщо б ми застосовували міграцію з попереднього прикладу, в базі даних з'явився б новий стовпець genre в таблиці book.

Цікавий факт:

якщо ви забудете застосувати міграцію, спробуєте зробити запит до нового поля, і воно не буде знайдене в базі даних — вітаємо, ви натрапили на "типову помилку новачка"!

3. showmigrations: Перевірка стану міграцій

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

python manage.py showmigrations

Приклад виводу:

app_name
 [X] 0001_initial
 [ ] 0002_add_genre_field

Тут [X] означає, що міграція була застосована, а [ ] — що міграція очікує свого часу.

4. sqlmigrate: Подивитися SQL-запит, який виконає міграція

Перед тим як застосувати міграцію, ви можете подивитися, який SQL-код вона збирається виконати:

python manage.py sqlmigrate app_name 0002

Це корисно, якщо ви хочете бути впевненими, що міграція не робить щось несподіване (наприклад, не видаляє важливі дані).

Проблеми та рішення при роботі з міграціями

Робота з міграціями — це як катання на велосипеді: спочатку страшно, але потім звикаєш. Однак бувають ситуації, які можуть тебе вибити з колії. Давай розберемо їх.

Проблема: Конфлікти міграцій

Якщо ти працюєш в команді, може статися так, що два розробники паралельно створили свої міграції. Наприклад, один додав поле genre, а інший — поле rating.

При спробі застосувати міграції ти можеш отримати помилку. Це відбувається, коли порядок міграцій у файлах порушується.

Рішення: можна використовувати команду python manage.py merge для об'єднання конфліктуючих міграцій, але найчастіше проблема вирішується ручним редагуванням файлів міграцій.

Проблема: Видалення міграції

Іноді ти можеш випадково створити міграцію, яка не потрібна, або змінити модель неправильно.

Рішення: просто видали файл міграції з папки migrations, а потім виконай makemigrations ще раз.

Практична частина: створення міграцій

  1. Крок 1: створіть модель для застосунку.
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    birth_year = models.IntegerField()
  1. Крок 2: створіть міграцію для цієї моделі.
python manage.py makemigrations
  1. Крок 3: застосуйте міграцію.
python manage.py migrate
  1. Крок 4: переконайтесь, що таблиця з'явилася в базі даних. Наприклад, якщо ви використовуєте SQLite, відкрийте базу даних та подивіться структуру таблиць через утиліту.

Як працюють міграції "під капотом"?

Кожен файл міграції містить Python-код, який описує зміни в базі даних за допомогою спеціальних класів і методів.

Наприклад:

from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('app_name', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='book',
            name='genre',
            field=models.CharField(max_length=50),
        ),
    ]

Цей приклад додає нове поле genre в існуючу таблицю book.

Кращі практики при роботі з міграціями

  • Часто виконуйте makemigrations і migrate. Це допоможе уникнути накопичення змін, які складніше синхронізувати.
  • Використовуйте систему контролю версій (наприклад, Git) для відстеження файлів міграцій.
  • Перевіряйте SQL перед застосуванням міграції за допомогою sqlmigrate, особливо якщо зміни складні.
  • Пишіть читабельні імена для міграцій. Django генерує їх автоматично, але ви можете перейменувати файл, щоб було зрозуміло, що він робить.

Наприклад, замість 0002_auto_xyz.py назвіть файл 0002_add_genre_field.py.

Таким чином, міграції в Django — це потужний інструмент, який допомагає нам залишити в минулому необхідність ручного управління базою даних і відкриває шлях до більш продуктивної розробки. Крок за кроком ви освоїте всі нюанси роботи з міграціями і відчуєте себе справжнім майстром управління схемою даних!

Коментарі (1)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Марк Рівень 50
1 січня 2026
Створення першої міграції - в описі є згадування про команду makemigrations але відсутній пункт про виконання команди migrate