JavaRush /Курси /Модуль 3: Django /Створення міграцій і їх виконання

Створення міграцій і їх виконання

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

Допустимо, у тебе є проєкт, в якому потрібно зберігати дані користувачів, їх замовлення і... котиків (куди ж без них?). Ти створюєш моделі в Django, описуєш у коді, як виглядають таблиці бази даних, але поки база даних навіть не здогадується про їх існування. Щоб "розповісти" базі даних про наші моделі, нам потрібні міграції.

Міграції — це спосіб перетворення твоїх моделей (Python-код) у таблиці бази даних. Вони витягують інформацію про моделі та створюють SQL-скрипти, які потім застосовуються до бази даних.

Навіщо нам міграції?

  • Керування змінами: якщо ми змінюємо моделі (додаємо поле, змінюємо тип даних), міграції допоможуть коректно відобразити ці зміни в базі даних.
  • Версійність: міграції фіксують зміни у структурі бази даних. Вони працюють, як Git для твоїх моделей.
  • Автоматизація: Django бере на себе всю роботу і генерує SQL-код за тебе. У тебе більше часу на меми про програмістів.

Процес міграції можна розділити на три етапи:

  1. Витяг змін із моделей: Django аналізує поточний і попередній стани моделей.
  2. Створення файлу міграції: файл міграції містить інструкції щодо зміни бази даних.
  3. Застосування міграції: Django відправляє SQL-команди базі даних і змінює її структуру.

Команди для роботи з міграціями

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

  1. python manage.py makemigrations

Ця команда аналізує ваші моделі та генерує файл міграції. Ми використовуємо її, коли створюємо або змінюємо моделі.

Приклад:

$ python manage.py makemigrations

Якщо все пройшло успішно, ви побачите щось на кшталт:

Migrations for 'app_name':
  app_name/migrations/0001_initial.py
    - Create model MyModel

Що тут сталося?

  • Міграція 0001_initial.py створена для застосунку app_name.
  • Django автоматично згенерував файл міграції з інструкцією для створення моделі MyModel.
  1. python manage.py migrate

Ця команда застосовує міграції до бази даних. По суті, вона відправляє SQL-запити, які створюють таблиці, додають або змінюють поля.

Приклад:

$ python manage.py migrate

Ви побачите вивід, що показує успішне виконання міграцій:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying app_name.0001_initial... OK
  1. python manage.py showmigrations

Ця команда дозволяє подивитися список існуючих міграцій та їх статус (чи були вони застосовані до бази даних).

Приклад:

$ python manage.py showmigrations

Результат може бути таким:

admin
 [X] 0001_initial
auth
 [X] 0001_initial
app_name
 [ ] 0001_initial

У цьому прикладі:

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

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

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

Крок 1: створення моделі

Ми додамо модель для зберігання інформації про книги (назва, автор і дата публікації). Додай наступний код у файл models.py додатку:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    is_available = models.BooleanField(default=True)

    def __str__(self):
        return self.title

Крок 2: генерація міграції

Тепер створимо міграцію за допомогою команди makemigrations:

$ python manage.py makemigrations

Ти побачиш, що Django створив міграцію для моделі Book.

Крок 3: перегляд створеної міграції

Зазирнемо у файл міграції. Він буде знаходитися у папці migrations твого додатку (наприклад, my_app/migrations/0001_initial.py):

# Generated by Django X.Y on YYYY-MM-DD HH:MM
from django.db import migrations, models

class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Book',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=100)),
                ('author', models.CharField(max_length=100)),
                ('published_date', models.DateField()),
                ('is_available', models.BooleanField(default=True)),
            ],
        ),
    ]

Тут ти бачиш, як модель Book інтерпретується у SQL-команди для створення таблиці.

Крок 4: застосування міграції

Тепер застосуємо міграцію за допомогою команди migrate:

$ python manage.py migrate

Вивід покаже, що таблиця Book успішно створена.

Зміна моделей та робота з міграціями

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

Крок 1: зміна моделі

Додамо поле genre до нашої моделі Book:

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    is_available = models.BooleanField(default=True)
    genre = models.CharField(max_length=50, default='Fiction')  # Нове поле

Крок 2: створення нової міграції

Знову використовуємо команду makemigrations:

$ python manage.py makemigrations

Django створює нову міграцію, яка додає поле genre до таблиці Book.

Крок 3: застосування міграції

Застосовуємо зміни до бази даних:

$ python manage.py migrate

Тепер таблиця Book оновлена з новим полем genre.

Зворотні міграції: "Ой, я помилився"

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

Команда migrate <app_name> <migration_name>

Щоб відкотити міграцію, вкажи ім'я додатка та міграцію, до якої потрібно повернутися.

Приклад:

$ python manage.py migrate app_name 0001

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

Типові помилки та підводні камені

  • Не забувайте зберігати моделі перед makemigrations. Якщо зміни не збережені, Django їх не побачить.
  • Робота з реальними даними потребує обережності. Переконайтеся, що нова структура не ламає існуючі дані.
  • Поле потребує значення, але дані вже є. Якщо ви додаєте обов'язкове поле null=False до моделі з існуючими даними, додайте атрибут default, інакше виникне помилка.
  • Видалення полів. Якщо ви видаляєте поле з моделі, будьте уважні: всі дані в цьому полі будуть видалені.

Міграції — це серце вашої бази даних, і все, що ви робите з Django ORM, одного дня опиниться у міграцій "на столі". Тому бережіть їх, і вони будуть берегти вашу базу даних.

3
Опитування
Основи Django ORM, рівень 7, лекція 4
Недоступний
Основи Django ORM
Основи Django ORM
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ