JavaRush /Курси /Модуль 4: FastAPI /Налаштування автоматичних міграцій у FastAPI та Django

Налаштування автоматичних міграцій у FastAPI та Django

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

Уявіть, що ви працюєте над великим проєктом у команді з десятка розробників. Кожного дня — десятки змін у моделях даних, оновлень схем бази даних і купа міграцій. Ваш CI/CD пайплайн має бути досить розумним, щоб:

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

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


Основні компоненти автоматизації

Щоб автоматизувати міграції, нам знадобляться:

  1. Alembic (для FastAPI) або Django ORM:
    Alembic ми вже обговорювали раніше — він чудово генерує й застосовує міграції.
    Django ORM має вбудовану систему міграцій, яка теж відмінно справляється з цим завданням.
  2. Система контролю версій (Git):
    Щоб зберігати міграції й зміни в коді.
  3. Система CI/CD (наприклад, GitHub Actions):
    Для виконання міграцій під час тестування й деплою.
  4. Тестові і продакшн оточення:
    Для безпечного тестування міграцій перед їх застосуванням у production.

Налаштування автоматизації міграцій у FastAPI

1. Інтеграція Alembic з CI/CD

Припустімо, у нас є FastAPI проєкт з уже підключеним SQLAlchemy і Alembic. Налаштуємо автоматичне оновлення бази даних.

Крок 1. Переконайтесь, що alembic.ini налаштований правильно

Ваш файл alembic.ini, який було ініціалізовано раніше, має вказувати на правильну базу даних:


sqlalchemy.url = postgresql+psycopg2://user:password@db_host/db_name

Крок 2. Додайте скрипт для автоматичного застосування міграцій

Створіть bash-скрипт migrate.sh у корені вашого проєкту:


#!/bin/bash

# Виконуємо міграції бази даних
echo "Running Alembic migrations..."
alembic upgrade head

Зробіть файл виконуваним:


chmod +x migrate.sh

Тепер цей скрипт буде оновлювати базу даних до останньої версії.

Крок 3. Інтеграція з GitHub Actions

Створіть файл .github/workflows/deploy.yml, щоб налаштувати CI/CD пайплайн:


name: CI/CD Pipeline

on:
  push:
    branches:
      - main

jobs:
  run-migrations:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout Git Repository
      uses: actions/checkout@v3

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.12'

    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt

    - name: Run Alembic Migrations
      run: ./migrate.sh

Ця конфігурація виконує міграції щоразу, коли ви пушите зміни у гілку main.

2. Тестова база даних

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

Додайте міграції в ваш тестовий скрипт:


pytest && ./migrate.sh

Налаштування автоматизації міграцій у Django

Django відомий своєю вбудованою системою міграцій. Налаштуємо деплой і міграції для Django-додатка.

  1. Переконайтесь, що міграції в репозиторії
    Не забудьте додати папку з міграціями в Git, щоб вони завжди були в актуальному стані:
    
    git add your_app/migrations/
    git commit -m "Add migrations"
    
  2. Додайте міграції в пайплайн
    Створіть bash-скрипт migrate.sh для Django:
    
    #!/bin/bash
    
    # Виконуємо міграції бази даних
    echo "Running Django migrations..."
    python manage.py migrate
    
    Зробіть файл виконуваним:
    
    chmod +x migrate.sh
    
  3. Інтеграція з GitHub Actions
    Налаштування пайплайна CI/CD для Django:
    
    name: Django CI/CD Pipeline
    
    on:
      push:
        branches:
          - main
    
    jobs:
      run-migrations:
        runs-on: ubuntu-latest
    
        steps:
        - name: Checkout Git Repository
          uses: actions/checkout@v3
    
        - name: Set up Python
          uses: actions/setup-python@v4
          with:
            python-version: '3.12'
    
        - name: Install Dependencies
          run: |
            python -m pip install --upgrade pip
            pip install -r requirements.txt
    
        - name: Collect Static Files
          run: python manage.py collectstatic --noinput
    
        - name: Run Migrations
          run: ./migrate.sh
    

Поради та хитрощі

  1. Автоматичне створення міграцій: налаштуйте окремий крок у CI/CD для перевірки наявності всіх актуальних міграцій:
    
    alembic revision --autogenerate
    
  2. Перевірка нових міграцій перед збіркою:
    ви можете автоматично перевіряти, що всі існуючі моделі відповідають схемі бази даних:
    
    alembic check
    
  3. Створення резервних копій бази даних:
    кожного разу перед автоматичним застосуванням міграції на production робіть дампи бази даних. Це врятує від потенційних помилок:
    
    pg_dump db_name > backup.sql
    
  4. Безпечне розгортання:
    використовуйте стратегію "blue-green deployment" (або її аналоги), щоб спочатку оновити схему бази даних у новому оточенні, протестувати її, а потім переключити трафік.

Поширені проблеми та помилки

Автоматизація часто додає трохи магії, а магія, як ви знаєте, іноді ламається сама по собі. Ось кілька поширених проблем:

  1. Застосування міграцій у неправильному порядку:
    якщо ви випадково видалите стару міграцію, Alembic або Django можуть заплутатися. Переконайтесь, що порядок міграцій узгоджений у всіх оточеннях.
  2. Конфлікт версій:
    якщо два розробники одночасно створюють міграції, це може призвести до конфліктів при мерджі. Використовуйте командні правила, щоб узгоджувати міграції.
  3. Неповне тестування міграцій:
    зміни в базі даних можуть бути непомітні до деплою. Завжди тестуйте міграції в ізольованому оточенні.
  4. Проблеми з автогенерацією:
    Alembic іноді не може коректно зрозуміти зміни (наприклад, при зміні зв'язків між таблицями). Завжди перевіряйте автогенерований код!

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

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