Допустимо, у тебе є проєкт, в якому потрібно зберігати дані користувачів, їх замовлення і... котиків (куди ж без них?). Ти створюєш моделі в Django, описуєш у коді, як виглядають таблиці бази даних, але поки база даних навіть не здогадується про їх існування. Щоб "розповісти" базі даних про наші моделі, нам потрібні міграції.
Міграції — це спосіб перетворення твоїх моделей (Python-код) у таблиці бази даних. Вони витягують інформацію про моделі та створюють SQL-скрипти, які потім застосовуються до бази даних.
Навіщо нам міграції?
- Керування змінами: якщо ми змінюємо моделі (додаємо поле, змінюємо тип даних), міграції допоможуть коректно відобразити ці зміни в базі даних.
- Версійність: міграції фіксують зміни у структурі бази даних. Вони працюють, як Git для твоїх моделей.
- Автоматизація: Django бере на себе всю роботу і генерує SQL-код за тебе. У тебе більше часу на меми про програмістів.
Процес міграції можна розділити на три етапи:
- Витяг змін із моделей: Django аналізує поточний і попередній стани моделей.
- Створення файлу міграції: файл міграції містить інструкції щодо зміни бази даних.
- Застосування міграції: Django відправляє SQL-команди базі даних і змінює її структуру.
Команди для роботи з міграціями
Так, міграції можуть налякати, але насправді все дуже просто. Django надає нам кілька чарівних команд, які перетворюють управління базою даних на задоволення:
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.
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
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, одного дня опиниться у міграцій "на столі". Тому бережіть їх, і вони будуть берегти вашу базу даних.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ