Metadata-Version: 2.4
Name: django-backup-migrations
Version: 2.0.0
Summary: Расширение механизма миграций Django для резервного копирования данных
Author-email: "АО \"БАРС Груп\"" <education_dev@bars-open.ru>
Classifier: Intended Audience :: Developers
Classifier: Environment :: Web Environment
Classifier: Natural Language :: Russian
Classifier: Operating System :: OS Independent
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Framework :: Django :: 4.2
Classifier: Framework :: Django :: 5.0
Classifier: Framework :: Django :: 5.1
Classifier: Framework :: Django :: 5.2
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: setuptools; python_version >= "3.12"
Requires-Dist: Django
Requires-Dist: attrs

# Расширение механизма миграций Django для резервного копирования данных

## Описание

Пакет `django-backup-migrations` расширяет стандартный механизм миграций Django, добавляя возможность автоматического создания резервных копий данных перед применением миграций. Это позволяет откатывать изменения в случае ошибок при выполнении миграций.

### Основные возможности

- **Автоматическое определение таблиц** для резервного копирования на основе операций миграции
- **Два типа резервного копирования**:
  - `full` — полная копия всех данных таблицы
  - `partial` — копия только изменённых данных с момента последнего резервного копирования
- **Автоматическое определение зависимостей** между таблицами через внешние ключи и триггеры
- **Управление состояниями**: просмотр, откат и удаление состояний вместе с резервными таблицами в схеме backup

### Требования

- Python 3.10+
- Django 4.2+
- PostgreSQL (адаптер по умолчанию)

## Подключение

### 1. Установка пакета

```sh
pip install django-backup-migrations
```

### 2. Добавление в INSTALLED_APPS

```python
INSTALLED_APPS = [
    ...
    'django_backup_migrations',
    ...
]
```

### 3. Настройка конфигурации (опционально)

```python
# settings.py
DJANGO_BACKUP_MIGRATIONS_ENABLED = True  # Включить/выключить резервное копирование
```

Или программно:

```python
import django_backup_migrations

django_backup_migrations.set_config(
    django_backup_migrations.Config(
        enabled=True,
        tables_dependencies={
            'app_table': {'related_table1', 'related_table2'},  # Явные зависимости
        }
    )
)
```

## Использование

### Основная команда: backupmigrate

Команда `backupmigrate` заменяет стандартную команду `migrate` и выполняет резервное копирование перед применением миграций.

#### Базовое использование

```sh
# Применить все неприменённые миграции
python manage.py backupmigrate

# Применить миграции для конкретного приложения
python manage.py backupmigrate app_name

# Применить конкретную миграцию
python manage.py backupmigrate app_name 0004

# Применить миграции с полным резервным копированием
python manage.py backupmigrate --backup-type full

# Применить миграции с частичным резервным копированием (по умолчанию)
python manage.py backupmigrate --backup-type partial
```

#### Параметры команды

- `--backup-type` — тип резервного копирования:
  - `full` — полная копия всех данных
  - `partial` — копия только изменённых данных (по умолчанию)
- `--backup-strategy` — стратегия резервного копирования (путь к классу стратегии)
- Все стандартные параметры команды `migrate` (например, `--database`, `--fake`, `--plan`)

### Управление состояниями

#### Просмотр списка состояний

```sh
# Показать все состояния миграций
python manage.py liststates
```

Вывод показывает:
- ID состояния
- Дата и время создания
- Статус (применено/ошибка)
- Список применённых миграций

#### Откат к предыдущему состоянию

```sh
# Откат к конкретному состоянию по ID
python manage.py staterollback --to-state 5

# Откат от конкретного состояния к предыдущему
python manage.py staterollback --rollback-state 10

# Пробный запуск (dry-run) без реального отката
python manage.py staterollback --to-state 5 --dry-run
```

#### Удаление состояний

Команда `dropstates` удаляет записи о состояниях и связанные с ними резервные таблицы в схеме backup. Нужно указать ровно один способ выбора состояний:

```sh
# Удалить все состояния с id строго меньше указанного
python manage.py dropstates --before 10

# Удалить состояния с указанными id
python manage.py dropstates --id 3 --id 5 --id 7

# Оставить только последние N состояний (по дате), остальные удалить
python manage.py dropstates --keep-last 5

# Указать базу данных и пробный запуск
python manage.py dropstates --keep-last 3 --database default --dry-run
```

Параметры:
- `--before ID` — удалить все состояния с id < ID
- `--id ID` — удалить состояния с указанными id (можно передать несколько раз)
- `--keep-last N` — оставить только последние N состояний
- `--database` — имя базы данных (по умолчанию `default`)
- `--dry-run` — только показать, какие состояния будут удалены

## Разработка и качество кода

### Ruff

Проект использует **Ruff** для проверки и форматирования кода.

```sh
ruff check src/
ruff format src/
```

### isort

Проект использует **isort** для сортировки и организации импортов.

```sh
isort src/
```
