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 иногда не может корректно понять изменения (например, при изменении связей между таблицами). Всегда проверяйте автогенерированный код!

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

1
Задача
Модуль 4: FastAPI, 7 уровень, 9 лекция
Недоступна
Настройка и выполнение миграции в FastAPI
Настройка и выполнение миграции в FastAPI
1
Задача
Модуль 4: FastAPI, 7 уровень, 9 лекция
Недоступна
Настройка script для автоматической миграции в Django
Настройка script для автоматической миграции в Django
3
Опрос
Синхронизация миграций в командах разработки, 7 уровень, 9 лекция
Недоступен
Синхронизация миграций в командах разработки
Синхронизация миграций в командах разработки
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Марат Уровень 77
1 марта 2026
Как доказать валидатору что миграция была применена к базе данных?